STL与泛型编程<三>:deque

和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();
  1. 总的来说deque和vectore非常的像
  2. 其长处是在首尾部进行插入删除操作,因此会多这个这样的成员函数
  3. 不和vector一样提供容量相关操作(capacity()和reverse()),
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值