顺序容器概述
容器名 | 特点 |
---|---|
vector | 可变大小数组,支持快速随机访问。尾部之外的位置插入或删除元素速度很慢 |
deque | 双端队列,支持快速随机访问。在头尾位置插入/删除元素速度很快 |
list | 双向链表,只支持双向顺序访问。在list任何位置插入/删除速度都很快 |
forward_list | 单向列表,只支持单项顺序访问。链表任何地方插入/删除速度都很快 |
array | 固定大小数组,支持快速随机访问,不能插入/删除元素 |
string | 与vector相似,专门用来保存字符。尾部插入/删除速度很快 |
- 关于各个容器的优缺点:
容器名 | |
---|---|
string、vector | 元素保存在连续的内存空间中,由于连续通过下标访问速度很快。在容器中间添加元素会非常耗时,在完成依次添加操作后,需要移动之后的所有元素以保持连续存储 |
list、forward_list | 设计目的是令容器任何位置插入/删除都很方便,所以作为代价为了访问一个元素只能遍历容器 |
- 选择容器的一些标准
1.除非有很好的理由,否则使用vector
2.如果程序有很多小的元素,而且空间开销很重要。则不要使用list或者forward_list.
3.如果要求随机访问元素,则使用deque或者vector
4.如果程序要求在容器的中间插入删除元素,则使用list或forward_list
5.如果只在首位删除插入元素,则使用deque。
新标准库容器的性能几乎与最精心优化过的同类数据结构一样好(通常会更好)
容器库概览
迭代器
迭代器有着公共的接口:所有提供相同操作的迭代器对这个操作的实现方式是相同的。
- 迭代器声明:
vector<int>::iterator iter;
首先是容器名称,然后尖括号内写容器储存的类型,之后作用域符号+iterator表明现在声明了此容器的迭代器,最后为此迭代器的名字。
- 迭代器范围
一个迭代器范围由一堆迭代器构成,两个迭代器分别指向容器中的元素或者尾元素之后的位置。通常被称为begin和end。
元素范围为 [ begin,end ).
迭代器必须指向同一个容器,end不能位于begin之前(但可以重合)。
可以通过递增运算使begin==end;可以使用循环来处理元素范围
while(begin!=end)
{
*begin=val;
++begin;}
**当然迭代器也不一定一定是从容器头部开始到结尾结尾结束。我们也可以借助begin() 与 end()函数打开迭代器之后再进行运算。
int main(