-
容器与算法
-
顺序容器:
将单一类型元素聚集起来成为容器,根据位置存储和访问这些元素。容器中元素排列次序与元素值无关,而是与添加到容器的次序决定的。
三种顺序容器类型:vector、list、deque(double-ended queue,简称”deck”)
三种顺序容器适配器:stack、queue、priority_queue
顺序容器类型 | |
---|---|
顺序容器 | |
vector | 支持快速随机访问 |
list | 支持快速插入/删除 |
deque | 双端队列 |
顺序容器适配器 | |
stack | 后进先出(FILO) 栈 |
queue | 先进先出(FIFO) 队列 |
priority_queue | 有优先级管理的队列 |
1.顺序容器定义
头文件:
#include <vector>
#include <list>
#include <deque>
所有容器都是类模板。
定义容器类型,容器名后面必须加一对包含容器中存放元素类型的尖括号
vector<string> svec; // empty vector that can hold strings
list<int> ilist; // empty list that can hold ints
deque<Sales_item> items; // empty deque that holds Sales_items
以上容器类型都定义了不带形参的默认构造函数,用于创建之类型的空容器对象;
需去掉T前面的单引号
容器构造函数 | |
---|---|
C<’T> c; | 创建名为c的空容器,适用于所有容器 |
C<’T> c1(c) | 创建容器c的副本,c1和c必须具有相同的容器类型,适用与所有容器 |
C<’T> c2(b,e) | 创建c,其元素为迭代器b,e范围之间的元素的副本,适用于所有容器 |
C <’T> c3(n,t) | 用n个值为t的元素创建容器c3,仅适用于顺序容器 |
C<’T> c4(n) | 创建n个调用含有默认构造函数初始化元素的容器,仅适用与顺序容器 |
1.1将一个容器初始化为另一个容器的副本
vector<int> ivec;
vector<int> ivec2<ivec> // ok:ivec is vector<int>
list<int> ilist(ivec) // error:ivec is not list <int>
vector<double> dvec(ivec); // error:ivec holds int not double
-
1.2初始化为一段元素的副本
-
通过传递一个容器的一对迭代器到另一个容器,实现容器元素的存储,但不要求容器类型相同,目标容器内元素类型也可以不相同,相互兼容即可,既可以互相转换就行。
// initialize slist with copy of each element of svec
list<string> slist(svec.begin(),svec.end());
// find midpoint int vector
vector<string>::iterator mid = svec.begin() + svec.size()/2;
// initialize front with first half of svec:The elements up to but not including *mid
deque<string> front(svec.begin(),mid);
// initialize back with second half of svec:The elements *mid through end of svec
deque<string> back(mid,svec.end());
指针就是迭代器
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<string> words2(words,words+words_size);
1.3分配和初始化指定数目的元素
const list<int>::size_type list_size = 64;
list<string> slist(list_size,”eh?”); // 64 strings,each is eh?
创建容器时,可以仅仅指定容器的大小:
list<int> ilist(list_size); //64 elements,each initialize to 0
// svec has as many elenments as the return value from get_word_count
extern unsigned get_word_count(const string &file_name);
vector<string> svec(get_word_count(“Chimera”));
采用这种类型初始化,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。无默认构造函数,必须显示指定其元素初始化式。
接受容器大小做形参的构造函数只适用与顺序容器,而关联容器不支持这种初始化。