将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。
顺序容器类型 | |
顺序容器 | |
vector | 支持快速随机访问 |
list | 支持快速插入/删除 |
deque | 双端队列 |
顺序容器适配器 | |
stack | 后进先出(LIFO) 栈 |
queue | 先进先出(FIFO)队列 |
Priority_queue | 有优先级管理的队列 |
那么到底如何定义顺序容器呢?首先必须要包含相关的头文件 也就是下列头文件之一
A.#include<vector> B.#include<list> C.#include<deque>
与上面三个顺序容器一一对应 视情况而定用哪个头文件。所有的容器都是类模板。要定义某种特殊的容器 必须在后面制定容器所包含元素的类型 如(std::string 前面的std::省略):
vector<string> svec;
List<int> ilist;
Deque<Salis_item> items;
所有容器类型都定义了默认构造函数,用于创建指定类型的空对象容器,默认构造函数不带参数。当然,除了默认的构造函数呢,容器还有其他的构造函数 利用这些构造函数,程序员就可以指定元素初值。下面简单说说几种容器的构造函数:
C<T> c :创建一个名为c的空容器。C对应的是容器类型名(vector / list / deque),T则对应的是容器包含元素的类型(int / string)。
C c(c2); 此种是创建容器c2的副本c,但是呢 c和c2必须具有相同的容器类型,并且所包含元素的类型也相同。
C c(b,e); 创建c,其元素是迭代器b(begin)和e(end)表示的范围内元素的副本。
C c(n,t); 用n个值为t(例如10个8,9个‘a’)的元素创建容器c,但是值t必须是容器所包含的元素的类型(如果不是也可以进行转换)。
下面说说容器之间的复制 我们不能将一种容器内的元素直接复制给另外一种容器(当然 如前面的C c(c2) 容器的类型和其所包含的元素的类型相同时 这个是可以直接复制的),虽然不能直接复制 但是我们可以通过传递一对迭代器间接地来实现该功能 如下:
//用svec的每个元素来初始化slist
list<string> slist(svec.begin(),svec.end());(svec在上面已定义)
//找到vector的中点
vector<string>::iterator mid=svec.begin()+svec.size()/2;
//初始化队列 用来初始化的元素是svec的前半部分
Deque<string> front(svec.begin(),mid);
既然讲到了这里 不妨我们再来回顾一下指针 其实指针就是迭代器 所以也可用指针达到以上效果 如下:
Char *words[]={"stately","plump","buck","mulligan"};
//计算数组“words[]”的元素个数
Size_t words_size=sizeof(words)/sizeof(char*);
//使用数组”words“的所有元素进行初始化”words2“
List<string> words2(words,words + words_size);
words + words_size 将数组长度加到指向第一个元素的指针上就可以得到指向数组末端的下一个位置的指针 那么上面word2括号里面的意思即是 从指向word第一个元素到末端的下一个元素 即整个数组
下面在谈谈迭代器的范围 C++使用一对迭代器来标记迭代器的范围 这两个迭代器分别指向同一个容器中的两个元素(通常用first/last beg/end )来标记容器中的一段元素范围。