STL之deque

来源:互联网 发布:腾讯软件助手 编辑:程序博客网 时间:2024/05/16 07:28

        deque(double-ended  queue)即双端队列,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。也可像栈一样,可以用一个铁道转轨网络来比喻双端队列。

        在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

        deque仅仅优先选择于需要大量的首或尾删除操作时。

        deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

 

deque的逻辑结构:

 

 

使用时要包含deque头文件( #include<deque> ),要命名限定std::deque。

 

构造:

deque<int> c 创建一个空的int类型的deque

deque<int> c1(c2) 复制一个deque。

deque<int> c(n) 创建一个deque,含有n个数据,数据均已缺省构造产生。

deque<int> c(n, int) 创建一个含有n个elem拷贝的deque

deque<int> c(beg,end) 创建一个以[beg;end)区间的deque

c.~deque<int>() 销毁所有数据,释放内存

 

方法:

c.push_front() 在头部插入一个数据

c.push_back() 在尾部插入一个数据

c.pop_front() 删除头部数据

c.pop_back() 删除尾部数据

c.size() 返回容器中实际数据的个数

c.assign(beg,end) 将[beg; end)区间中的数据赋值给c

c.assign(n,int) 将n个int的拷贝赋值给c

c. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range

c.back() 返回容器c的最后一个元素的引用(如果c为空,则该操作未定义)

c.begin() 传回迭代器中的第一个数据地址

c.clear() 移除容器中所有数据

c.empty() 判断容器是否为空

c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一位置

c.erase(pos) 删除pos位置的数据,传回下一个数据的位置

c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置

c.front() 返回容器c的第一个元素的引用(如果c为空,则该操作为空)

get_allocator 使用构造函数返回一个拷贝

c.insert(pos,int) 在pos位置插入一个int拷贝,传回新数据位置

c.insert(pos,n,int) 在pos位置插入n个int数据,无返回值

c.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据,无返回值

c.max_size() 返回容器c可容纳的最多元素个数

c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素的前一个位置

c.resize(num) 重新指定队列的长度

c.swap(c2) 交换容器c和c2中的所有元素

swap(c1,c2) 交换容器c1和c2中的所有元素,和上一方法相似

 

deque相对于vector的两大特点:

1.    可在常数时间内对首尾进行插入、删除操作。

2.    没有capacity(),不需要reserce(size_type n)。这是因为deque由动态分配的连续空间组合而成,随时可以增加一段新的空间链接起来。它没有必要像vector那样“因旧空间不足而重新分配2倍的空间,然后复制元素,再释放旧空间”。

        虽然deque也提供随机访问迭代器,但其复杂度不能和vector同日而语,这当然影响了各个运算层面。为提高效率,对deque进行排序时,可先将deque拷贝到vector中,再使用STL的sort算法,最后再复制回deque。

       deque是由一段一段的定量连续空间构成。一旦有以要在deque的前端和尾端增加新空间,便配置一段定量连续空间,串在整个deque的头端或尾端。deque的最大任务就是在这些分段的连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了“重新配置、复制、释放”的轮回,代价是复杂的迭代器架构。

 

注意:

1、除了at()函数,其他成员函数都不会检查索引或迭代器是否有效。

2、元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。

0 0
原创粉丝点击