容器deque和vector非常相似。它也采用动态数组来管理元素,提供随机存取,并有着和vector几乎一模一样的接口。不同的是deque的动态数组头尾都是开放,因此能再头尾两端进行快速安插和删除。
deque与vector不同的接口:
c.push_front(elem); 在头部插入elem的一个副本
c.pop_front(); 移除头部元素
deque的各项操作只有一下几点和vector不同:
1. deque不提供容操作(capacity()和reserve())
deque不支持对容器和内存重分配。特别注意的是,除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的任何引用、指针、迭代器失效。
2. deque直接提供函数,用以完成头部元素的安插和删除(push_front()和pop_front())
3. 除了at(),没有任何成员函数会检查索引或迭代器是否有效
4. 元素的插入或删除可能可能导致内存重新分配,所以任何安插或删除动作都会使所有指向deque元素的指针、引用、迭代器失效。唯一例外是在头部或尾部。动作之后,指针和引用仍然有效(但是迭代器就没那么幸运)。
总之,如果是以下情形,最好采用deque
1. 你需要在两端安插和删除元素
2. 无需引用容器内的元素
deque实例:
#include<iostream>
#include<deque>
#include<string>
#include<algorithm>
using namespace std;
void main()
{
deque<string> coll;
coll.assign(3,string(“string”));
coll.push_back(“last string”);
coll.push_front(“first string”);
copy(coll.begin() , coll.end() ,
ostream_iterator<string>(cout , “\n”));
cout<<endl;
coll.pop_back();
coll.pop_front();
for(int i=1; i<coll.size();++i)
{
coll[i]= “another” + coll[i];
}
coll.resize(4, “resized string”);
copy(coll.begin() , coll.end() ,
ostream_iterator<string>(cout , “\n”));
cout<<endl;
}
程序输出:
first string
string
string
string
last string
string
another string
another string
resized string