C++容器--- 顺序性容器<deque>

来源:互联网 发布:手机淘宝如何申请贷款 编辑:程序博客网 时间:2024/05/19 10:09

--------------------------------------------------------------------------------------------------------------------------------

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,具体可以遵循下面的原则
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

--------------------------------------------------------------------------------------------------------------------------------


deque的特点:

1、支持随机访问,即支持[]以及at(),但是性能没有vector好。

2、可以在内部进行插入和删除操作,但性能不及list。

deque和vector的不同之处:

1、两端都能够快速插入和删除元素。vector只能在尾端进行。

2deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。

3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。

4deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

5、不支持对容量和内存分配时机的控制。

注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointersreferencesiterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。

6deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。

dequevector相似的特性:

1、在中间部分插入和删除元素相对较慢,因为所有元素都要被移动。

2、迭代器属于随机存取迭代器。

最好采用deque的情形:

1、需要在两端插入和删除元素。

2、无需引用容器内的元素。

3、要求容器释放不再使用的元素。



包含头文件deque

#include <deque>


构造方法:

  1. deque<type> deq                                        创建一个没有任何元素的双端队列
  2. deque<type> deq(otherDeq)                    用另一个类型相同双端队列初始化该双端队列
  3. deque<type> deq(size)                              初始化一个固定size的双端队列
  4. deque<type> deq(n, element)                  初始化n个相同元素的双端队列
  5. deque<type> deq(begin,end)                   初始化双端队列中的某一段元素,从begin 到 end - 1
双端队列的特有操作(双端对列是顺序容器顺序容器容器的共有操作)

  1. deq.assign(n,elem)               赋值n个元素的拷贝给双端队列
  2. deq.assign(beg,end)            赋值一段迭代器的值给双端队列
  3. deq.push_front(elem)           添加一个元素在开头
  4. deq.pop_front()                       删除第一个元素
  5. deq.at(index)                           取固定位置的元素
  6. deq[index]                                取固定位置的元素
  7. deq.front()                                返回第一个元素(不检测容器是否为空)
  8. deq.back()                                返回最后一个元素(不检测容器是否为空)

练习代码:

#pragma warning(double:4786)#include <iostream>#include <deque>#include <functional>#include <algorithm>using namespace std;void print(double &t) {cout << t << " ";}template<class T> void print_deque(deque<T>& dt) {//迭代器相关函数//返回值为迭代器型:begin()、end()、rbegin()、rend()、//返回值为引用:front()、back()deque<T>::iterator d;for (d = dt.begin();d!=dt.end(); d++){cout << *d << " ";}}void main() {//定义deque<double> d1;deque<double> d2(5);deque<double> d3(5, 4);deque<double> d4(d1);deque<double> d5(d1.begin(), d1.end());d4.resize(6);cout <<"d4的size:" <<d4.size() << endl;for (int i = 0; i < 7; i++){double dt = i*1.01 + 4.5;d1.push_front(dt);}d1.push_back(66);cout << "  L1:";for_each(d1.begin(), d1.end(), print);cout << endl;//判断是否为空empty()if(!d1.empty()) {d1[2] = 7.7;  //deque提供了运算符[]和at()cout << "d1的第二个元素是:";print(d1.at(2));}cout << endl;cout << "  修改元素后的L1:";print_deque(d1);cout << endl;//assign()重置d1.assign(4,0);cout << "  重置assign后的L1:";print_deque(d1);cout << endl;//交换swapswap(d1,d3);cout << "swap后 d1:";print_deque(d1);cout << endl;cout << "swap后 d2:";print_deque(d2);cout << endl;//插入insert()d2.insert(d2.begin(),6.666);//erase():单个元素或者相邻几个元素、clear():删除所有元素d2.erase(d2.begin()+1);d2.clear();//deque没有提供查找和搜索相关的函数,所以使用<algorithm>中的find()函数;deque<double>::iterator dt2 = find(d2.begin(),d2.end(),8.6);int step = (dt2 - d2.begin());cout <<"8.6在:"<< step << endl;//deque亦包含了很多运算符==、[]等system("pause");}