STL与泛型编程<三>:deque

和vector很相似,也采用动态数组来管理元素,提供随机存取,逻辑结构如下,注意deque虽然不是双向链表结构

deque通常实作为一组独立区块,第一块朝某方向扩展,最后一块区块朝另一方向扩展

deque的能力

与vector相比,deque的功能不同之处在于
1. 两段都能快速安插和溢出元素;因此它会多几个有关首尾安插移除重要的函数
2. 存取元素时,deque的内部结构多一个间接过程,所以元素存取比vector慢;
3. 除了头尾两段,在任何地方安插或删除元素可能导致元素内存重新分配,都将导致指向元素的reference,pointer,iterator失效,不过deque的内存重分配优于vectors,因为内部结构显示,deques不必再内存分配时复制所有元素。
4. deque的内存区块在不使用时,会被释放。deque的内存大小是可以缩减的

deque的操作函数

几乎和vector一样,见下图
STL与泛型编程<三>:deque_第1张图片
STL与泛型编程<三>:deque_第2张图片

最后看一个例子

#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();
  1. 总的来说deque和vectore非常的像
  2. 其长处是在首尾部进行插入删除操作,因此会多这个这样的成员函数
  3. 不和vector一样提供容量相关操作(capacity()和reverse()),

你可能感兴趣的:(STL与泛型编程<三>:deque)