简介
C++ STL 实现三类数据结构标准容器类 的实现:
顺序性容器vector 从后面快速的插入与删除,直接访问任何元素
deque 从前面或后面快速的插入与删除,直接访问任何元素
list 双链表,从任何地方快速插入与删除
关联容器
set 快速查找,不允许重复值
multiset 快速查找,允许重复值
map 一对多映射,基于关键字快速查找,不允许重复值
multimap 一对多映射,基于关键字快速查找,允许重复值
容器适配器
stack 后进先出
queue 先进先出
priority_queue 最高优先级元素总是第一个出列
迭代器
iterator定义。
- template<class _Category,
- class _Ty,
- class _Diff = ptrdiff_t,
- class _Pointer = _Ty *,
- class _Reference = _Ty&>
- struct iterator
- : public _Iterator_base_universal
- { // base type for all iterator classes
- typedef _Category iterator_category;
- typedef _Ty value_type;
- typedef _Diff difference_type;
- typedef _Diff distance_type; // retained
- typedef _Pointer pointer;
- typedef _Reference reference;
- };
迭代器的五种类型
分别由五个空的结构体来标识(只是巧妙的应用于参与重载函数中参数的解析)。
(1)输出迭代器。 用于存取有序序列的元素,即不能从容器中把元素读出来。
- *next=<whatever> ,即定义了赋值操作符,同时复制构造函数也是必要的;
- ++next 改变next为指向序列中的下一个元素。
- 当两个类型为X的迭代器p和q没有同时指向一个元素时,p!=q为真。即定义了==(!=的相反)操作符。
- *p是类型T的右值
- ++next 改变next为指向序列中的下一个元素。
- 前向迭代器的特性;
- --pre改变pre为提向链表的前一项。
- 双向迭代器特性;
- 定义了比较操作符<(>, <=, >=);
- 定义了与整型的加减操作符;
- 定义了[ ]操作符。
- ++next 改变next为指向序列中的下一个元素。
vector
基础
以连续数组方式存储。
支持随机迭代器。
属性
al; //分配器
pointer pFirst; //所控列表的开始位置指针
pointer pLast; //所控列表的结束位置的下一指针
pointer pEnd; //当前已配数组的结束位置的下一指针
适用性
vector适用于需要快速地随机存取被控元素。
basic_string与vector的选择
1》basic_string的元素只能拥有默认构造函数和析构函数,而vector不限定构造函数和析构函数,另需赋值操作符。
2》basic_string可以移交以NULL结尾的序列,vector只处理我们存储在它里面的序列。
3》basic_string使用写时复制?来优化。
list
基础
以双链表方式存储。
只能以连续方式对元素进行存取,线性复杂度。
支持双向迭代器。
所有的容器中只有list保证在异常出现时回退到操作前的状态?
属性
_Alty _Alval; // 结点分配器
_Nodeptr _Myhead; // 虚拟头结点指针,向前移动则指向序列开始处,向后移动则指向其末端
size_type _Mysize; // 结点数
适用性
list适用于重排序列操作(插入,删除,替换)。
不适用于元素定位操作(查找,随机存取);额外开销:前向和后向指针。