C++顺序容器

标准库定义了三种顺序容器类型:verctor、list、deque(双端队列)

verctor:支持快速随机访问。

list:支持快速插入​删除。

deque:双端队列

1、容器构造函数


容器构造函数

将一个容器复制给另一个容器时类型必须匹配,容器类型和元素类型都必须相同。​

​(1)跨容器类型初始化容器

尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递​

一对迭代器(第 3.4 节)间接实现该实现该功能。使用迭代器时,不要求容器

类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制

的元素转换为所构建的新容器的元素类型,即可实现复制。

迭代器标记了要复制的元素范围,这些元素用于初始化新容器的元素。迭代

器标记出要复制的第一个元素和最后一个元素。采用这种初始化形式可复制不能

直接复制的容器。更重要的是,可以实现复制其他容器的一个子序列:

list slist(svec.begin(), svec.end());

(2)使用数组初始化容器

char *words[] = {"stately", "plump", "buck", "mulligan"};

// calculate how many elements in words

size_t words_size = sizeof(words)/sizeof(char *);

// use entire array to initialize words2

list words2(words, words + words_size);

2、迭代器

(1)迭代器的通用操作


迭代器的通用操作 

(2)、vector和deque的额外操作



​3、取容器元素迭代器方法

begin()、end()、first()、last()​

4、插入元素

push_back()所有的顺序容器走支持此操作,在容器尾部插入一个元素。

list 和 deque 容器类型还提供了类似的操作:push_front。这个操作实现在容器首部插入新元素的功能。


顺序容器中添加元素的操作

5、顺序容器的大小操作


​6、顺序容器内元素的访问操作



​如果下标越界at操作会抛出异常。

另外可以使用begin()和end()获取容器的迭代器进行元素访问操作,通过判断迭代器和​end()是否相等可以安全的访问容器中的元素。

7、顺序容器的删除操作



​8、赋值与swap


​assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中。与复制容器元素的构造函数一样,如果两个容器类型相同,其元素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器。如果在不同(或相同)类型的容器内,元素类型不相同但是相互兼容,则其赋值运算必须使用 assign 函数。带有一对迭代器参数的 assign 操作允许我们将一个容器的元素赋给另一个不同类型的容器。

swap 的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

vector元素必须连续存储以便索引访问,所以不能在内存中随便找个地方存储这个新元素。于是,vector 必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间中的元素被复制到新存储空间里,接着插入新元素,最后撤销旧的存储空间。

9、容器容量

vector 类提供了两个成员函数:capacity 和reserve

capacity操作获取在容器需要分配更多的存储空间之前能够存储的元素总数(包括size),而 reserve操作则告诉 vector 容器应该预留多少个元素的存储空间。

​10、容器的选择

(1)。vector 和 deque容器提供了对元素的快速随机访问,但付出的代价是,在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大。list 类型在任何位置都能快速插入和删除,但付出的代价是元素的随机访问开销较大,访问某个元素要求遍历涉及的其他元素通常来说,除非找到选择使用其他容器的更好理由,否则vector 容器都是最佳选择。

(2)deque容器拥有更为复杂的数据结构,deque主要有如下特性

<1>与vector一样,在deque中间insert和erase元素效率比较低

<2>不同于vector的是,deque提供了高效的在其首部实现insert和erase操作,就像在容器尾部一样

<3>与vector容器一样,而不同于list容器的是,deque支持对所有的元素的随机访问

<4>在deque容器的首部和尾部插入元素不会使任何迭代器失效,而首部和尾部删除元素只会使指向被删元素的迭代器失效,在其他任何位置的插入和删除操作将会使指向该容器元素的所有迭代器都失效。

posted @ 2016-11-27 10:56  luizp  阅读(143)  评论(0编辑  收藏  举报