c++11 顺序容器概括(1)
第一篇博文,希望不是最后一篇。o(∩_∩)o 哈哈
接下来几篇博文会由浅到深地介绍 STL 超好用的顺序容器。
- 容器: 就是一些特定类型对象的集合。
- 顺序容器: 定义:顺序容器是容器的一类。该类容器中,对象(元素)在 容器中的位置 与加入容器的顺序相对应,不依赖元素的值。
注意:顺序容器几乎可以保存任意类型的元素,但可能限制元素容器操作。详情请看下篇博文。
- 所有顺序容器公共的 特点 : 所以顺序容器都提供了快速顺序访问元素的能力。
顺序容器的类型
vector(常用) | 1.可变大小单向尾部数组 2.支持快速随机访问 3.不在后面插入删除可能速度慢 |
deque | 1.可变大小双向队列 2.支持快速随机访问 3.在头尾插入删除很快 |
list | 1.可变大小双向链表 2.只支持顺序访问 3.在任何位置插入删除很快 |
forward_list(c++11) | 1.可变大小单向头部链表 2.只支持顺序访问 3.在任何位置插入删除很快 |
array(c++11) | 1.固定大小数组 2.支持快速随机访问 3.没插入删除但可以赋值 |
string |
1.和vector很像,特例化,专门用来存字符 如:'a','b' |
说明: 顺序: 1.元素保存在 连续 的内存空间中,用下标查找很快。
但不在 开口地方(开口:vector/string 在尾部,deque 在头尾) 插入删除(array 一边玩去)会很慢。
2.用迭代器访问时,支持算术运算符。如:
1 std::vector<int>::iterator it = v.begin(); 2 it = it +2;
随机: 1.要访问一个元素,需要访问整个容器。但插入删除(array 你又来)很快。
2.用迭代器访问时,不支持算术运算符,但支持自增自减。如:
1 std::list<int>::iterator it = v.begin(); 2 it = it +2; //错误 3 it++; 4 it++;
- 有关 c++11 标准容器:
array: 设计目的:更安全,更容易使用数组类型。
但是 大小固定(安全嘛),所以不支持任何改变容器大小的操作。
forward_list:设计目的:达到的性能 与 我们写的最好的单向链表的性能 相当。
特别:没有 size 操作。对其他容器来说,size 操作保证是常量时间的操作(包括list)
- 选择顺序容器的原则:
1. vertor 是最好的选择,除非你有更好的选择。
2. 有很多小元素,空间开销重要。不要用 list 和 forward_list。
3. 要随机访问:选择 vector 和 deque
4. 要求中间插入删除:list 和 forward_list
5. 要求奇葩,如:要在中间插,然后要随机访问。
可以用各种方法解决:a. list 存 然后 copy 到 vector。
b. 直接用 vector 尾部插入,再用 STL 的 sort 排序到中间
c.....
tips: 对于公共操作(如建模板的操作),用迭代器,不使用下标,避免随机访问的可能。
2015-04-15