一、顺序容器概述
1.1
vector | 可变大变小数组。支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢 |
deque | 双端队列。支持快速随机的访问,在头尾位置插入/删除速度很快 |
list | 双向链表。只支持双向顺序访问,在list中任何位置进行插入/删除操作速度都很快 |
forward_list | 单向链表。只支持单向顺序访问,在链表任何位置进行插入/删除操作速度都很快 |
array | 固定大小数组。支持快读随机访问。不能添加或删除元素 |
string | 与vector相似的容器。但专门用于保存字符。随机访问快,在尾部插入/删除速度很快 |
string和vector将元素保存在连续的内存空间中,进行插入/删除操作后,需要移动插入/删除位置之后的左右元素,来保持连续存储。
二、容器库概览
2.1
当将一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型都必须相同
list<string> name = {"Tom", "Jim","Kitty"};
vector<const char*> item = {"he","she","me"};
list<string> list1(name); //true
list<int> list2(name); //false 元素类型必须相同
vector<string> vector1(name); //false 容器类型必须相同
//ture (array除外)拷贝由一个迭代器对指定的元素范围,不要求容器类型和元素类型相同
fowared_list<string> list3(item.begin(), item.end());
2.2
int age[5] = {0,1,2,3,4};
int cpy[5] = age; //false 内置数组不支持拷贝或赋值
array<int, 10> digits = {0,1,2,3,4};
array<int, 10> copy = digits; //true 只要数组类型匹配即合法
三、顺序容器操作
3.1 使用emplace操作
调用emplace_front、emplace和emplace_back等成员函数时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数再容器管理的内存中直接构造元素。而调用push或insert成员函数,是将元素类型的对象传递给他们,这些对象被拷贝到容器中。
3.2 访问元素
在容器中访问元素的成员函数(front、back、下标和at)返回的都是引用。如果容器是一个const对象,返回值是const的引用。如果容器不是const的,则返回值是普通引用,可以改变元素的值。
3.3 forward_list
四、vector对象是如何增长的
五、容器适配器
三个顺序容器适配器:stack、queue和priority_queue
默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的