STL容器:deque

来源:互联网 发布:网络算命软件下载 编辑:程序博客网 时间:2024/05/14 19:46

1. 概念
vector支持随机访问每个元素,所需要的时间为常量,其在末尾增加或删除元素所需时间与元素数目无关,但是,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。和vector相比,deque 是一个双向开口的连续线性空间,它允许在常数时间内对头端进行元素的插入或删除操作。需要注意的是,虽然deque也支持常数时间的随机访问,但是,由于其数据内存特点,其效率较vector会低很多,所以,除非有头部增删数据需求,否则建议使用vector。

2. API
deque提供了很多接口,以下列出deque的成员函数和操作:

(constructor)    Construct deque container (public member function)
(destructor)    Deque destructor (public member function)
operator=    Copy container content (public member function)

Iterators:
begin    Return iterator to beginning (public member function)
end    Return iterator to end (public member function)
rbegin    Return reverse iterator to reverse beginning (public member function)
rend    Return reverse iterator to reverse end (public member function)

Capacity:
size    Return size (public member function)
max_size    Return maximum size (public member function)
resize    Change size (public member functions)
empty    Test whether container is empty (public member function)

Element access:
operator[]    Access element (public member function)
at    Access element (public member function)
front    Access first element (public member function)
back    Access last element (public member function)

Modifiers:
assign    Assign container content (public member function)
push_back    Add element at the end (public member function)
push_front    Insert element at beginning (public member function)
pop_back    Delete last element (public member function)
pop_front    Delete first element (public member function)
insert    Insert elements (public member function)
erase    Erase elements (public member function)
swap    Swap content (public member function)
clear    Clear content (public member function)

Allocator:
get_allocator    Get allocator (public member function)

3. deque内存
deque从逻辑上来看是连续的内存,本质上是由一段段固定大小的连续空间组成。deque采用类似索引的结构管理内存,如下:

image

采用一小块连续的内存索引缓存结点,每一个缓存结点也是一段连续的空间,可以存储多个数据。当索引内存空间满载,需要申请一块更大的内存做索引。

4. 为什么deque没有capacity和reserve

vector有capacity和reserve函数,deque和list一样,没有capacity和reserve函数。之所以这样,主要是因为list和deque两者都没有必要保留这两个函数,list是以1为增量动态增加内存,deque则是分段动态增加内存。capacity返回当前所分配的内存块大小,vector在调用函数reserve(n)之后,其capacity将至少为N=n,reserve函数的作用是当现有内存空间小于N时重新分配内存。如果事先知道要插入N个元素,则与不断分配内存相比,预先调用reserve可以加快程序的运行速度

5. deque使用示例

代码如下:

 

输出结果:
mydeque size: 5
mydeque contains: 2 1 1 1 3

6. 迭代器失效

引用:
The C++ Standard Library:
Any insertion or deletion of elements other than at the beginning or end invalidates all pointers, references, and iterators that refer to elements of the deque.

SGI:
The semantics of iterator invalidation for deque is as follows. Insert (including push_front and push_back) invalidates all iterators that refer to a deque. Erase in the middle of a deque invalidates all iterators that refer to the deque. Erase at the beginning or end of a deque (including pop_front and pop_back) invalidates an iterator only if it points to the erased element.

Standard working draft:
An insert in the middle of the deque invalidates all the iterators and references to elements of the deque. An insert at either end of the deque invalidates all the iterators to the deque, but has no effect on the validity of references to elements of the deque."

总结如下:
1. 在deque中间插入或者删除将使所有deque元素的迭代器、引用、指针失效
2. 在deque首部或者尾部插入元素会使迭代器失效,但不会引起引用和指针失效
3. 在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效

deque迭代器失效较复杂,使用的时候需要小心。

7. 结语
deque支持随机访问每个元素,其所需要的时间为常量。在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除元素所需时间随元素数目呈线性变化。可动态增加或减少元素,内存管理自动完成,不提供用于内存管理的成员函数

参考:
http://stackoverflow.com/questions/913980/confusion-on-iterators-invalidation-in-deque
stl源码剖析

原创粉丝点击