[zz]C++标准库:std_deque双端队列容器
个人总结
STL 中有队列的标准实现,为什么不用呢?
但是如果想要用阻塞队列,那么必须要自己用锁构建了。
下面是转载的详细:
--------------------------------------------------------------------我是无情的分割线------------------------------------------------------------------------
摘要:本文是“C++标准库导引系列”的一部分。在学习C语言的时候大家都知道,数据结构是对大量数据的组织的 方式。队列一直都一个重要的且存在典型应用的数据结构。C++标准库定义的队列是典型的队列的一个实现或描述。队列是先进先出的序列的结构,同时也是一种 使用方式。本文介绍C++的std::deque,它是一个双端队列,支持从两个头进行操作。
std::deque接口与std::vector几乎相同,但它与std::vector的能力却不完全的相同,对于std::vector如果 从头插入或删除元素是非常缓慢的过程,但对于std::deque却完全不一样。对于std::deque而言从头部插入或删除元素与从尾部的操作一样快 速,并且是平均的常量时间。除了这一点,std::deque在很多时候它提供了std::vector的所有能力。现在我们可能产生了为什么要 std::vector而不使用std::deque,是因为std::deque的内部结构要比std::vector复杂,相应操作的开销会稍微大一 些,包括时间与空间的开销。
为了使用std::deque,我们只需要如下简单开始:
class Type;
//产生一个空的容器
std::deque<Type> deque;
//产生一个指定区间的容器
std::deque<Type> deque(begin, end);
//产生包含n个由默认构造函数构造的对象的容器
std::deque<Type> deque(n);
一个容器提供了两个基本的内容:一个是对元素的组织,一个是对元素的使用。std::deque正如它的名字,它的典型情况就是被当作元素的队列的 来使用:把一个元素插入std::deque,然后使用的时候依据这个次序进行,所谓先进先出(FIFO)。在现实的许多应用情景都是一个队列,比如游戏 里的某个排队。
class Type;
std::deque<Type> deque;
//在deque尾部插入元素
deque.push_back(v_1);
deque.push_back(v_2);
deque.push_back(v_3);
//在deque的头部取出元素
deque.front();//取出头部第一个元素,此时为v_1
deque.pos_front();//删除头部第一个元素,此时为v_1
deque.front();//此时为v_2
deque.pos_front();//此时为v_2
这就是简单使用元素形成一个队列。
C++标准库的容器为我们提供了管理一组数据的功能,同时它们也提供一种典型的使用方式,再加入多种附加的使用方式。作为一个队列是 std::deque的典型使用,如果遇到这个典型应用的时候我们应该不要犹豫地使用,但很多时候可能存在一个困难的选择过程,比如我们要一个“栈”的使 用方式——先进后出,那么我们至少可以使用std::deque或std::vector来实现,此时我选择的标准是性能与现实可能的使用方式的改变。如 果单单是一个栈,那么std::vector可能比std::deque更好的选择,但如果这个使用方式在某一天改变为“队列”的 话,std::deque就是更好的选择了,因为它可以不花费太大就可以做到这个扩展。需要注意的是,这个改变是需要确定的,并且是现实可能性,并是理论 的可能性,理论上没有什么不可能,所以似乎就没有选择std::vector的必要的,然而事实上并非如此。
本文先写到这里了,祝大家学习之旅愉快!