1.泛型程序设计
把代码从特定的数据结构中分离出来,使得它不依赖于特定的数据结构而更加通用
容器->迭代器->算法
适配器
2.概念:用于界定具备一定功能的数据类型
comparable:可比较
Assignable:可赋值
Sortable:可比较且可赋值
3.模型:符合一个概念的数据类型就是该概念的模型
e.g. int 为comparable概念的模型
4.用概念做模板参数名
5.STL:standard template library 容器、迭代器、函数对象、算法
容器<->迭代器(作为算法的参数)->算法 ->函数对象(作为算法的参数)
- 容器:头文件<vector>
- 顺序
- 有序关联
- 无序关联
- 容器适配器:栈stack 队列queue 优先队列priority_queue
- 迭代器:泛型指针,包含头文件<iterator>
- ++,*,->,--
- 函数对象:泛化的函数 ,头文件<functional>
- 算法:头文件<algorithm>
transform
6.迭代器:泛型指针
输入流迭代器 istream_iterator <T> (cin) *(p++)
输出流迭代器 ostream_iterator <T> (cout,“输出间隔”) *(p++)=x
前向迭代器:输入&输出迭代器,且可单向遍历
双向迭代器:输入&输出迭代器,且可双向遍历
随机访问迭代器:双向迭代器,且可在任意两个位置跳转
两个迭代器表示一个区间[p1,p2)
迭代器的辅助函数:advance(p,n);distance(first,last)
7.容器基本功能和分类
迭代器访问方式分类:可逆容器,随机访问容器
容器数据组织方式分类:顺序容器、关联容器(有序、无序)
容器通用功能:
- 默认构造函数构造空容器
- 关系运算
- begin(),end()
- clear()
- empty()
- size()
- s1.swap(s2)
相关数据类型:S::iterator,S::const_iterator
对可逆容器的访问:rbegin(),rend()
相关数据类型:S::reverse_iterator,S::reverse_const_iterator
8.顺序容器:(长度可扩展的数组)
vector ,queue, list, forward_list(特殊的添加删除操作), array(大小固定)
线性排列,随时插入删除元素,可赋值(assignable)
接口(不包括array和foward_list):
- 构造函数
- 赋值函数assign
- 插入函数insert、push_front(list deque)、push_back、emplace、emplace_front
- 删除函数erase、clear、pop_front(list deque)、pop_back、emplace_back
- 首尾元素的直接访问front、back
- 改变大小resize
9.顺序容器
- vector 随机访问快,插入删除慢
- 向量的容量:s.capacity() ;s。reserve(n) 使容量至少为n, 不够则扩展
- deque:两端插入删除快,中间插入删除慢,随机访问较快,比vector慢
- list:插入删除快,不能随机访问,能拼接操作
- forward_list:
- array: 大小固定
顺序容器的比较
- 大量随机访问:vector
- 少量随机访问,两端插入: deque
- 不需随机访问,需插入删除:list
- 数组:array
顺序容器的插入迭代器
- 前插迭代器
- 后插迭代器
- 任意位置插迭代器
顺序容器的适配器:以顺序容器为基础构建一些常用的数据结构,对顺序容器进行封装
- 栈stack:先进后出 ;任意一种顺序容器为基础
- 队列queue:先进先出;以前插顺序容器list deque为基础
- 优先级队列priority_queue:最大的元素先出
栈和队列共同支持操作:
- s1 operator s2; size() ;empty() ;pop() ;push();
栈支持的操作:top()
队列支持的操作:front();back();
10.关联容器
特点:每个关联容器都有一个key,可高效查找元素
接口:插入insert、删除erase、查找find、定界low_bound upper_bound equal_range、计数count
单重关联容器:map、set 键值唯一,一个键值对应一个元素
多重关联容器:multiset、multimap 键值不唯一,一个键值对应一个元素
简单关联容器:set、multiset 只有一个类型参数键,容器元素就是键本身
二元关联容器:map、multimap 有两个类型参数,分别表示键和元素类型
无序关联容器:unordered_set、unordered_map、unordered_multiset、unordered_multimap
哈希函数和键类型的==运算符来组织元素
11.集合set:存储一组无重复的元素,有序,数据类型为键本身
12.映射map:数据类型为键和附加数据构成的二元组(key,value)
13.多重集合和多重映射:去掉了键为一的限制
14.函数对象
15.函数适配器
16.算法