0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正!
1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有:
- 容器: 管理某类对象的集合. 不同的容器有各自的优缺点.
- 迭代器: 用来在一个对象集群(Collection of Objects) 的元素上进行遍历. 这个CoB可以是容器/容器的一部分. 每种容器都提供了自己的迭代器.
- 算法(Algorithm): 用来处理集群内的元素(比如: 查询,修改,排序等).
- 适配器(adapter)
- 仿函数(functors or function objects)
2. STL基本观念是将数据和操作分离, 数据交给容器进行管理, 操作(算法)可以定制算法, 使用迭代器来提供两者间统一的接口.
- STL 的概念有点儿和OOP的最初思想矛盾, 然而这个小框架提供了很好的容器/算法弹性.
- STL 是泛型编程的出色范例, 容器和算法对任意型别和类别而已已经一般化了.
- STL 提供了适配器和仿函数可以实现对算法的: 补充, 约束 和定制, 从而满足不同的需求.
3. 容器
- 序列式容器(Sequence container): 可序集群.(3个) ---- vector/deque/list (为什么queue,stack 和 string不是呢?)
- 可以将strings 和 array 也当作是一种序列式容器(why?)
- array 是C/C++语言核心所支持的一个型别(type), 而不是(class). 具有静态大小和动态大小. 但它也并不是STL容器. 因为没有类似size(),empty()等成员函数. 但是STL的设计又允许它调用STL算法. 当我们以static arrays作为初始化行时特别有用.
- 没有必要直接编写dynamic array了, 因为可以用vector实现.
- 关联式容器(Association container): 已序集群(4个). 排序和元素值,插入顺序无关. ---- set/multiset/map/multimap
- 自动会对元素进行排序. 默认情况下是使用 operator < 进行比较.
- 一般关联容器由二叉搜索树实现 , 各容器的主要差别在于元素的类型已经处理重复元素的方式.
- set: 按内部元素的值进行排序, 不允许重复.
- multiset: 和set相同, 但允许重复
- map: key/values , 键不允许重复.
- multimap: 和map一样, 但键允许重复.可以用来当做字典.
4. 容器适配器
- stack: FILO
- queue: FIFO
- priority_queue: 下一个出队的元素永远是具有最高优先级的元素 ( 默认比较是 operator < 所以数值越小,优先级越高? ).
5. 迭代器(基本操作)
- operator */++/==/!=/=
- 每种容器都必须提供自己的内部类, 事实上每种容器都将其适配器定义为内部类.
- 任何一种容器都有2种类别的迭代器
- container::iterator
- container::const_iterator
6. 关联式容器的一些应用
- typedef set<int> IntSet; / typedef set<int, greater<int> >IntSet; greater<> 是一个预先定义的仿函数.
- 所有的关联容器都有一个insert()方法, 但是没有序列式容器的push_back(),push_front()方法 , 因为你没有权力指定新元素的位置.
- map 允许使用 operator [] 来安插元素. 而multimap不允许使用下标操作符(因为key可以重复哦).
- 存取multimap或map的元素时, 必须用pair结构的first和second成员才能访问到具体key/value
1 #include <iostream> 2 #include <map> 3 #include <string> 4 using namespace std; 5 int main(){ 6 typedef map<string,float> StringFloatMap; 7 StringFloatMap coll; 8 coll["VAT"] = 0.15; 9 coll["pi"] = 3.14; 10 coll["This is a string"] = 3.4; 11 coll["NULL"] = 0; 12 StringFloatMap::iterator it = coll.begin(); // map 是不能手动排序,但是并不是没有序 13 for(;it!=coll.end();++it){ // 使用++it效率高于 it++ 14 cout<<it->first<<" : "<<it->second<<endl; 15 } 16 return 0; 17 }
7. 迭代器分类(2种)
- 双向迭代器(Bidirectional iterator): list/set/multiset/map/multiset提供的属于此类.
- 随机存取迭代器(Random access iterator): vector/deque/strings提供的属于此类. 随机访问迭代器可以支持 operator <
8. 算法
- 不是容器的成员函数, 而是搭配迭代器使用的全局函数.
- pos = min_element(coll.begin(),coll.end()) / pos = max_element(coll.begin(),coll.end())
- sort(coll.begin(),coll.end()[,comp]);
- pos = find(coll.begin(),coll.end(),value);
- reserve(pos,coll.end())