一、顺序容器比较
容器类型 | 优缺点 |
---|---|
vector | 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 |
deque | 双端队列;支持快速访问;在头和尾部插入/删除速度很快 |
list | 双端队列;支持快速访问;在头和尾部插入/删除速度很快 |
forword_list | 单向链表;只支持单向顺序访问;在链表任何位置进行insert 或 delete 都很快 |
array | 固定大小数组;支持快速随机访问;不能增删元素 |
string | 和vector相似的容器;专门用于保存字符;随机访问快;在尾部插入删除速度快 |
二、顺序容器共用的类型
类型定义:这些类型体现了标准库与机器无关的一些特性
1. size_type
size()函数的返回类型
如果表达式中已经有了size()函数,就不要用int了,这样可以避免混用int和unsigned可能带来的问题。
2. iterator和const_iterator
3. 元素类型
value_type
元素类型的引用: reference 或者 const_reference
元素相关的类型别名在泛型编程中非常有用。
三、顺序容器的操作
1. 添加元素
标准库容器在运行时可以动态添加或删除元素来改变容器的大小。
注意:
- 添加元素是拷贝,而非对象本身。就像将对象传递给非引用参数一样,容器中的元素与提供值的对象之间没有任何关联。
2. 访问元素
注意:
- 访问成员函数返回的是引用,如果使用auto变量保存这些函数的返回值,并希望改变元素值,需要将变量定义为引用类型。
输出结果:std::vector<int> v{1,2,3}; if (!v.empty()){ v.front() = 55; auto &c = v.back(); c = 88; } for (auto x: v){ std::cout << x << std::endl; }
- 同样的下标操作访问,使用
v.at()
比v[]
更安全。
3. 删除元素
4. 改变容器大小
注意:
容器中添加或者删除元素,可能会导致容器元素指针、引用或迭代器失效。
合理的做法:
每次添加或者删除元素操作之后,重新定位迭代器。