C++标准程序库之deque

容器deque(发音为”deck”)和vector非常相似。它也采用动态数组来管理元素,提供随机存取,并有着和vector几乎一模一样的接口。不同的是deque的动态数组头尾都开放,能在头尾两端进行快速安插和删除。

使用deque之前,必须包含头文件<deuqe>
#include <deque>

其中,deque类型是定义于命名空间std内的一个class template:
namespace std {
template <class T, class Allocator = allocator<T>>
class deque;
}

和vector相同,第一个template参数用来表明元素类型——只要是assignable和copyable都可以胜任。第二个template参数可有可无,用来指定内存模型,缺省为allocator。

1.deque的能力

与vector相比,deque功能上的不同处在于:

(1)两端都能快速安插元素和移除元素。这些操作可以在分期摊还的常数时间内完成。
(2)存取元素时,deque的内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍慢一些。
(3)迭代器需要在不同区块间跳转,所以必须是特殊的智能型指针,非一般指针。
(4)在对内存区块有所限制的系统中,deque可以内含更多元素,因为它使用不止一块内存。因此deque的max_size()可能更大。
(5)deque不支持对容量和内存重分配时机的控制。除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的任何pointers,references, iterators失效。不过,deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素,
(6)deque的内存区块不再被使用时,会被释放。

deque的下述特性跟vector差不多:

(1)在中段部分插入、删除元素的速度相对较慢,因为所有元素都需要移动以腾出或填补空间。
(2)迭代器属于random access iterator

如果是以下情形,最好采用deque:

(1)需要在两端插入和移除元素
(2)无需引用容器内的元素
(3)要求容器释放不再使用的元素

2.deque的操作函数

(1)deque的构造函数和析构函数

(2)deque的非变动性操作(nonmodifying operations)

(3)deque的变动性操作

(4)deque的各项操作只有以下数点和vector不同

1)deque不提供容量操作(capacity()和reserve())。
2)deque直接提供函数,用以完成头部元素的安插和删除(push_front()和pop_front() )。

(5)还有一些值得注意的事情

1)除了at(),没有任何成员函数会检查索引或迭代器是否有效。
2)元素的插入或删除可能导致内存重新分配所以任何插入或删除动作都会使所有指向deque元素的pointers, references和iterators失效。唯一例外是在头部或尾部插入元素,动作之后,pointers和references仍然有效(但iterators就没这么幸运了)。

3.异常处理(Exception Handling)

原则上deque提供的异常处理和vector提供的一样。新增的操作函数push_front()和pop_front()分别对应于push_back()和pop_back()。因此,C++标准程序库保证下列行为:

(1)如果以push_back()或push_front()安插元素时发生异常,则该操作不带来任何效应。

(2)pop_back()和pop_front()不会抛出任何异常。

4.Deque运用实例

输出:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注