迭代器适配器是有迭代器的接口,但实际做的是其他事情。著名的有插入迭代器,流迭代器,反向迭代器
考虑到效率,stl没有很严格的异常检查,但保证两点:
对于基于节点的容器(list, set, map等),单个元素的插入操作实现commit-or-rollback
对于基于数组的容器,对结尾元素的插入实现success-or-no effect
deque的特性:
deque的接口和vector非常类似,但是没有reserve和capacity
deque在两端的插入非常快速,在中间插入较慢
deque支持随机访问,但所有成员不是都在一个连续的内存块中
set和map是用树存储和排序的,因此,不要修改set中的值和map中的key,只能增加和删除
stl迭代器辅助函数:
advance
distance
这两个函数可以根据迭代器的类型作不同优化,效率更高
反向迭代器
反向迭代器可以用正向迭代器转换过来,但转换后的位置有所改变,这是由于stl的区间都是闭开区间,这样处理后对两个迭代器定义的区间转换后可以直接使用 ,可以用base获得反向迭代器对应的正向迭代器
插入迭代器一般用赋值操作符实现对容器的插入
for_each是stl标准算法中唯一有返回的
预定义的函数适配器:bind1st, bind2nd, not1, not2
mem_fun_ref适用于对类对象引用调用函数
mem_fun用于对类对象指针调用函数
上述两个都要求是const成员函数
普通函数适配器ptr_fun
stl中用到多个区间的算法都要求第二个区间大于等于第一个区间
stl的算法操作不从容器删除元素,一是由于算法不了解容器的知识,二是为了效率
find算法系列是查找一个元素
search算法系列是查找一个区间,但find_end例外,可能是历史原因起来这个名字
transform可以从一个区间也可以从两个区间生成结果
没有copy_if函数,用remove_copy_if
用mismatch查找两个区间第一个不同的地方,如果返回的pair中都是end不表示区间相同,也可能是第二个区间较大。必须用equal比较区间相同
用copy_backward指定拷贝对象到目标的某个位置前
unique函数只删除连续的重复值
rotate可以实现数组的循环左移和游移效果
用prev_permutation 和next_permutation可以遍历容器内元素的排列
random_shuffle可以实现“洗牌”的效果
partition和stable_partition可以把容器根据一个值或者函数分成两个部分
heap算法可以产生堆序序列,其中的pop_heap不会直接删除元素,但会移动到最后一个
set系列函数都是对集合操作的模拟,但都容许有重复元素
merge和set_union非常类似,但merge不会对重复元素作处理
数值算法:
accumulate, 累加
inner_product, 内积
partial_sum, 计算到当前位置的和
adjacent_diffent, 计算相邻的差
其它容器:
stack
queue,接口类似stack,但pop返回第一个元素
priority_queue, 里面的元素按照堆序存放,pop返回最大的元素,如果都相等,返回第一个元素
bitset,模拟位运算
数值运算:
complex
valarray