一、STL组成
1、六大组件
容器(Container)、算法(Algorithm)、迭代器(Iterator)
仿函数(Function Object)、适配器(Adapter)、空间配置器(allocator)
2、STL的命名空间为std
3、 algorithm <alglrithm>
四个数值相关演算法 <numeric>
vector <vector>
list <list>
deque <deque>
stack <stack>
queue <queue>
priority queue <queue>
map <map>
set <set>
multimap <map>
multiset <set>
function objects <functional>
iterator adaptor <iterator>
二、容器的概念
1、用来管理一组元素
2、容器分为
1)序列式容器:每个元素都有固定位置--取决于插入时机和地点,和元素值无关
如:vector、deque、list
2)关联式容器:元素位置取决于特定的排序规则,和插入顺序无关
如:set、multiset、map、multimap
3、序列式容器
1)vector
将元素置于一个动态数组中加以管理
可以随机存取元素(用索引直接存取),支持operator[]
数组尾部添加或移除元素非常快速,但是在中部或头部安插元素比较费时
2)deque:double-ended queue
可以随机存取元素(用索引直接存取),支持operator[]
数组头部和尾部添加或移除元素都非常快速,但是在中部安插元素比较费时
3)list
双向链表
不提供随机存取(按顺序走到需存取的元素,O(n)),不支持operator[]
在任意位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。
4、关联式容器
1)set/multiset
内部的元素依据其值自动排序,不能用push_back等函数
set内的相同数值的元素只能出现一次,multiset内可包含多个数值相同的元素
内部由二叉树实现,便于查找
2)map/multimap
map的元素师成对的键值、实值,内部的元素依据其值自动排序
map内的相同数值的元素只能出现一次,multimap内可包含多个数值相同的元素
内部由二叉树实现,便于查找
5、容器的共同能力
所有容器提供的都是value语意,而非reference语意。容器执行插入元素的操作时,内部实施copy操作。所以STL容器内存储的元素
必须能够被拷贝(必须提供拷贝构造函数)
每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
6、容器的使用动机
vector deque list set multiset map multimap
典型内部结构 动态数组 二维数组 双向链表 二叉树 二叉树 二叉树 二叉树
可随机存取 是 是 否 否 否 对key而言是 否
元素搜索速度 慢 慢 非常慢 快 快 对key而言快 对key而言快
快速安插移除 尾部 头尾 任何位置 - - - -
安插移除导致 重新配置 总是如此 绝不会 绝不会 绝不会 绝不会 绝不会
失效(迭代
器、指针、引
用)
7、剩余容器
queue、stack, 都只不过是一种adapter,简单地修饰deque的界面而成为新的容器类型
三、迭代器
1、简述
通过迭代器,我们可以用相同的方式来访问、遍历容器
每种容器都必须提供自己的迭代器
迭代器是一个“可遍历STL容器内全部或部分元素”的对象
一个迭代器指出容器中的一个特点位置
具有遍历复杂数据结构的能力
2、迭代器的基本操作
Operator * 传回当前位置上的元素值
Operator ++ 将迭代器前进至下一元素
Operator == and Operator != 判断两个迭代器是否指向同一位置
Operator = 为迭代器赋值
3、作用
能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来
容器提供迭代器,算法使用迭代器
4、分类
不同容器提供自己的迭代器,所以不同迭代器具有不同的能力
不同的算法需要不同的迭代器的能力,相同的算法需要根据迭代器的能力不同而作相应的优化
input iterator output iterator
forward iterator
bidirectional iterator
random access iterator
5、迭代器的相关类型
有些算法内部需要用到迭代器所代表元素的类型,这个就是迭代器的相关类型
四、算法
1、泛型算法通则
所有算法的前两个参数都是一对iterators:[first, last],用来指出容器内一个范围内的元素
每个算法的声明中,都表现出它所需要的最低层次的iterator类型
大部分算法都可以用function object来更改准则。function object又称functor
2、算法列表(共70个)
accumulate() 元素累加
adjacent_difference() 相邻元素的差额
adjacent_find() 搜寻相邻的重复元素
binary_search() 二元搜寻
copy() 复制
copy_backward() 逆向复制
count() 计数
count_if() 在特定条件下计数
equal() 是否相等
equal_range() 是否相等,传回一个上下限区间范围
fill() 改填元素值
fill_n() 改填元素值n次
find() 搜寻
find_if() 在特定条件下搜寻
find_end() 搜寻某个字序列的最后一次出现地点
find_first_of() 搜寻某些元素的首次出现地点
for_each() 对范围内的每一个元素进行某操作
generate() 以指定动作的运算结果填充特定范围内的元素
generate_n() 以指定动作的运算结果填充n个元素内容
includes() 包含
inner_product() 内积
inplace_merge() 合并并取代
iter_swap() 交换元素
lexicographical_compare() 以字典排列方式做比较
lower_bound() 下限
max() 最大值
max_element() 最大值所在位置
min() 最小值
min_element() 最小值所在位置
merge() 合并两个序列
mismatch() 找出不吻合点
next_permutation() 获取下一个排列组合
nth_element() 重新安排序列中第n个元素的左右两端
partial_sort() 局部排序
partial_sort_copy() 局部排序并复制到它处
partial_sum() 局部综合
partition() 切割
prev_permutation() 获取前一个排列组合
random_shuffle() 随机重排
remove() 移除某种元素(但不删除)
remove_copy() 移除某种元素并将结果复制到另一个container
remove_if() 有条件的复制某种元素
remove_copy_if() 有条件的移除某种元素并将结果复制到另一个container
replace() 取代某种元素
replace_copy() 取代某种元素,并将结果复制到另一个container
replace_if() 有条件的取代
replace_copy_if() 有条件的取代,并将结果复制到另一个container
reverse() 颠倒元素次序
reverse_copy() 颠倒元素次序并将结果复制到另一个container
rotate() 旋转
rotate_copy() 旋转,并将结果复制到另一个container
search() 搜寻某个子序列
search_n() 搜寻[连续发生n次]的子序列
set_difference() 差集
set_intersection() 交集
set_symmetric_difference() 对称交集
set_union() 联集
sort() 排序
stable_partition() 切割并保持元素相对次序
stable_sort() 排序并保持等值元素相对次序
swap() 交换
swap_range() 交换,指定范围
transform() 以两个序列为基础,交互作用产生第三个序列
unique() 将重复的元素折叠缩编,使成唯一
unique_copy() 将重复的元素折叠缩编,使成唯一,并复制到它处
upper_bound() 上限
make_heap() 制造一个heap
pop_heap() 从heap中取出一个元素
push_heap() 将一个元素推进heap内
sort_heap() 对heap排序