STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。
STL容器是同质的,即存储的值的类型相同;算法是完成特定任务的处方;迭代器是能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。
STL不是面向对象编程,而是一种不同的编程模式-通用编程模式(generic programming)。
1. 慎重选择容器类型
- 标准STL序列容器: vector, string, deque 和 list.
- 标准STL关联容器:set, multiset, map 和 multimap.
- 非标准序列容器slist 和 rope.
- 非标准的关联容器 hash_set, hash_multiset, hash_map 和 hash_multimap.
基于算法复杂性考虑:
vector是默认应使用的序列类型;当需要频繁地在序列中间做插入和删除操作时,应使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。
STL一种分类方法:连续内存容器(contiguous-memory container)和 基于节点的容器(node-based container)。
2. vector
vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
- 将元素置于一个动态数组中进行管理
- 可以随机存取元素(用索引直接存取)
- 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时
使用说明:
使用vector前,必须包含头文件<vector>
例: vector<int> vec;
操作:vec.size() //容器实际数据的个数
vec.begin()//指向迭代器中的第一个数据地址
vec.capacity() //返回容器中数据的个数
vec.empty() //判断容器是否为空
vec.front() //返回第一个数据
vec.push_back(element) //在尾部加入一个元素
vec.pop_back(element) //删除最后一个数据
vec.end() //指向迭代器中末端的下一个,指向不存在元素
3. deque
是一种具有队列和栈的性质的数据结构。
- deque,是 double-ended queue 缩写
- 可以随机存取元素(用索引直接存取)
- 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时
4. list
- 双向链表
- 不提供随机存取(按顺序走到需要存取的元素,O(n))
- 在任何位置插入和删除都非常迅速,内部只需调整一下指针
5. iterator
iterator(迭代器) 是一种对象,它能够用爱遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定地址。迭代器修改了常规指针的接口。
- 迭代器是一个所谓的智能指针,具有遍历复杂数据结构的能力。迭代器是一个“可遍历stl容器内全部或部分元素”的对象
- 一个迭代器指出容器的一个特殊位置
- 具有遍历复杂数据结构的能力
6. 容器的共通能力
所有容器提供都是value语义,而非reference。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。
每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
通常STL不会丢出异常。要求使用运行者对确保传入正确的参数。
7. 容器的共通操作
1) 与大小相关的操作函数
c.size() 传回容器中的元素数量
c.empty() 判断容器是否为空
c.max_size() 传回元素最大可能数量
2)返回迭代器的函数
c.begin()
c.end()
c.rbegin() 返回一个逆向迭代器,指向逆向寻访时的第一元素
c.rend()