当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

深入研究 C++中的 STL Deque 容器

    本文档深入分析了std::deque,并提供了一个指导思想:当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好。

    介绍

    本文深入地研究了std::deque 容器。本文将讨论在一些情况下使用deque> 比vector更好。读完这篇文章后读者应该能够理解在容量增长的过程中deque 与vector在内存分配和性能的不同表现。由于deque> 和vector的用法很相似,读者可以参考vector 文档中介绍如何使用STL容器。

    Deque总览

    deque和vector一样都是标准模板库中的内容,deque是双端队列,在接口上和vector非常相似,在许多操作的地方可以直接替换。假如读者已经能够有效地使用vector容器,下面提供deque的成员函数和操作,进行对比参考。

    Deque成员函数

    函数描述 c.assign(beg,end)

    c.assign(n,elem)

    将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c. c.at(idx)

    传回索引idx所指的数据,如果idx越界,抛出out_of_range. c.back()

    传回最后一个数据,不检查这个数据是否存在。 c.begin()

    传回迭代器重的可一个数据。 c.clear()

    移除容器中所有数据。 deque<Elem> c deque<Elem> c1(c2)

    Deque<Elem> c(n)

    Deque<Elem> c(n, elem)

    Deque<Elem> c(beg,end)

    c.~deque<Elem>()

    创建一个空的deque.复制一个deque.创建一个deque,含有n个数据,数据均已缺省构造产生。

    创建一个含有n个elem拷贝的deque.创建一个以[beg;end)区间的deque.销毁所有数据,释放内存。 c.empty()

    判断容器是否为空。 c.end()

    指向迭代器中的最后一个数据地址。 c.erase(pos)

    c.erase(beg,end)

    删除pos位置的数据,传回下一个数据的位置。

    删除[beg,end)区间的数据,传回下一个数据的位置。 c.front()

    传回地一个数据。 get_allocator使用构造函数返回一个拷贝。 c.insert(pos,elem)

    c.insert(pos,n,elem)

    c.insert(pos,beg,end)

    在pos位置插入一个elem拷贝,传回新数据位置。

    在pos位置插入>n个elem数据。无返回值。

    在pos位置插入在[beg,end)区间的数据。无返回值。 c.max_size()

    返回容器中最大数据的数量。 c.pop_back()

    删除最后一个数据。 c.pop_front()

    删除头部数据。 c.push_back(elem)

    在尾部加入一个数据。 c.push_front(elem)

    在头部插入一个数据。 c.rbegin()

    传回一个逆向队列的第一个数据。 c.rend()

    传回一个逆向队列的最后一个数据的下一个位置。 c.resize(num)

    重新指定队列的长度。 c.size()

    返回容器中实际数据的个数。 C1.swap(c2)

    Swap(c1,c2)

    将c1和c2元素互换。

    同上操作。

    Deque操作

    函数描述 operator[]返回容器中指定位置的一个引用。

    上面这些特征和vector明显相似,所以我们会提出下面的疑问。

    问题:如果deque和vector可以提供相同功能的时候,我们使用哪一个更好呢?

    回答:如果你要问的话,就使用vector吧。

    或者你给个解释?

    非常高兴你这样问,的确,这并不是无中生有的,事实上,在C++标准里解释了这个问题,下面有一个片断:

    vector在默认情况下是典型的使用序列的方法,对于deque,当使用插入删除操作的时候是一个更好的选择。

    有趣的是,本文就是要非常彻底地理解这句话。

    什么是新的?

    细读上面两张表格,你会发现和vector比较这里增加了两个函数。

    1、c.push_front(elem) —— 在头部插入一个数据。

    2、c.pop_front() —— 删除头部数据。

    调用方法和c.push_back(elem)和c.pop_back()相同,这些将来会告诉我们对于deque> 会非常有用,deque可以在前后加入数据。>

    缺少了什么?

    同时你也会发现相对于vector> 缺少了两个函数,你将了解到deque> 不需要它们。

    1、capacity()—— 返回vector当前的容量。

    2、reserve() —— 给指定大小的vector> 分配空间。

    这里是我们真正研究的开始,这里说明deque> 和vector它们在管理内部存储的时候是完全不同的。deque是大块大块地分配内存,每次插入固定数量的数据。vector是就近分配内存(这可能不是一个坏的事情)。但我们应该关注是,vector每次增加的内存足够大的时候,在当前的内存不够的情况。下面的实验来验证deque不需要capacity()和reserve()> 是非常有道理的。

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接