1、顺序容器有vector(可变大小数组);deque(双端队列);list(双向链表);forward_list(单向链表);array(固定大小数组);string字符容器
2、通常vector是最好的选择,vector是模板而非类型;每个容器都包含一个头文件,文件名和类型名相同。
3、迭代器类似于指针
//定义迭代器类型iter,类型为list<string>中的iterator
list<string>::iterator iter;
list<string> a = {"Masa", "dfsf", "aeoko"};
auto it = a.begin();//it为list<string>::iterator类型
4、定义一个array时除了指定元素类型,还要指定容器大小。array可以进行拷贝赋值操作,内置数组不可以
array<string, 10>::size_type i;
array<int, 4> digits = {0, 1, 2, 3};
array<int, 4> copy = digits;
//但是不能用一个花括号列表赋值
copy = {0,2,4,5};//错
5、向一个vector、string、deque插入元素会使之前所有指向容器的迭代器、引用、指针失效。
6、向容器中插入元素
list<int> a;
int b=1;
a.push_back(b);//后插
a.push_front(b);//前插
vector<string> s;
s.insert(s.begin(), "hello");//把hello插入到s.begin()之前
//insert返回值指向新插入的元素
7、front、back成员函数返回容器的首尾元素的引用,即就是操作首尾元素
//a = b
auto a = *c.begin();
auto b = c.front();
c.front() = 42;//直接改变容器中元素的值
8、删除容器中元素(forward_list例外,单链表支持insert_after、emplace_after、erase_after)
pop_back(),pop_front() 删除首尾元素;
erase(迭代器) 删除迭代器指定元素,返回最后一个删除元素之后的位置
9、vector和string元素是连续存储的,容器预留一些空间作为备用来保存更多新元素。capacity告诉我们容器可以容纳多少元素;reserve通知容器应该准备保存多少个元素。resize成员函数只改变容器中元素的数目,而不是容器的容量。
10、string数值转换
11、顺序容器适配器(stack、queue、priority_queue(插入的元素不放在尾部,而是根据特定的优先级排列));适配器看做某种数据结构,可以把一些数据或其它数据结构嵌入其中。所有适配器都要求容器具有添加和删除元素的能力。
//str在vector上实现栈,初始化保存svec的拷贝
stack<string, vector<string>> str(svec);
//栈适配器
stack<int> intStack;
for(size_t i = 0; i != 10; ++i)
intStack.push(i);
while(!intStack.empty()){
int value = intStack.top();
intStack.pop();
}
//队列适配器queue