和vector很相似,也采用动态数组来管理元素,提供随机存取,逻辑结构如下,注意deque虽然不是双向链表结构
deque通常实作为一组独立区块,第一块朝某方向扩展,最后一块区块朝另一方向扩展
deque的能力
与vector相比,deque的功能不同之处在于
1. 两段都能快速安插和溢出元素;因此它会多几个有关首尾安插移除重要的函数
2. 存取元素时,deque的内部结构多一个间接过程,所以元素存取比vector慢;
3. 除了头尾两段,在任何地方安插或删除元素可能导致元素内存重新分配,都将导致指向元素的reference,pointer,iterator失效,不过deque的内存重分配优于vectors,因为内部结构显示,deques不必再内存分配时复制所有元素。
4. deque的内存区块在不使用时,会被释放。deque的内存大小是可以缩减的
deque的操作函数
几乎和vector一样,见下图
最后看一个例子
#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main(void)
{
deque<string> col;
col.assign(3,"string");
col.push_back("last");
col.push_front("first");
copy(col.begin(),col.end(),ostream_iterator<string>(cout," ")); //first string string string last
cout << endl;
col.pop_front();
col.pop_back();
for (int i=1; i<col.size(); ++i)
col[i] = "another " + col[i];
col.resize(4,"resize string");
copy(col.begin(),col.end(),ostream_iterator<string>(cout," ")); // string another string another string resize string
}
/*
刚开始出现错误:ostream_iterator’ was not declared in this scope
加入头文件#include <iterator>就好了
*/
再看一个例子,验证“除了头尾两段,在任何地方安插或删除元素,都将导致指向元素的reference,pointer,iterator失效”,结果貌似没有失效,以后再验证失效的时候吧
#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main(void)
{
deque<string> col;
col.push_back("first");
col.push_back("second");
col.push_back("third");
deque<string>::iterator pos;
pos = col.begin();
cout << *pos << endl; // first
col.push_back("last");
cout << *pos << endl; // first
col.push_front("zero");
cout << *pos << endl; //first
cout << *col.begin() << endl; // zero
col.insert(pos,"test");
cout << *pos << endl; // first
return 0;
}
总结
可以看出deque比容器共通操作多出以下个函数
push_back();
pop_back();
push_front();
pop_front();
resize();
- 总的来说deque和vectore非常的像
- 其长处是在首尾部进行插入删除操作,因此会多这个这样的成员函数
- 不和vector一样提供容量相关操作(capacity()和reverse()),