list为环型的双link list, 所以++,--即使到了最末也不会出问题的.
而vector/heap,是线形空间,++/--是会出问题的;所以一定要预先考虑到
heap堆的特点: 第一个是最大元素, de/add一个元素时间复杂度为log(n)
make_heap(将数据转换为堆,调整整个堆), sort_heap(将堆有序序列化存储,这样就不是堆了;否则就一直是以堆的结构存在), push_heap(针对最后元素,调整堆的有关部分), pop_heap(将最大元素移到最后,调整堆的有关部分)
. 质变算法(mutating algorithms) & 非质变算法(nonmutating algorithms)
质变算法: copy, swap, replace/replace_copy, fill, remove, permutation, partition, random_shuffling, sort
非质变算法: find, search, count, for_each, equal/mismatch, max/min
. 前闭后开区间, STL一般都是这种形式!
如果, STL的泛型函数的两个参数市一对iterator,称为first,last
STL习惯采用前闭后开的区间表示,即: [ first, last )
. 数值算法 (numeric).
accumulate(累计运算), inner_product(内积运算), adjacent_difference(两个相邻元素运算), partial_sum(前i个累计运算)
其中所有的运算部分都可以用仿函数来代替. e.g., minus<int>, plus<int>()
. 算法(algorithm).
如果参数形式为( first1, last1, first2 ), 即:区间1,区间2; 那么默认的结束的条件为:区间1-->直到last1;那么如果区间2的数目小于区间1的数目,则出现的结果是未知的. 其中如果是list类型,则结果未知,程序不崩溃; 如果是vector类型,则程序可能崩溃
equal(枚举区间1的元素,和区间2比较)
fill(将区间所有元素置值为x), fill_n(将某段区间的前n个元素置值为x)
iter_swap(将游标所指的元素值交换), swap(将值交换)
min/max, mismatch(找到第一个元素值不同的位置pair;如果区间2比区间1短,结果就不可预料了)
lexicographical_compare(象比较字符串那样比较,而不是只比较较短的一个区间的元素数目)
copy, 如果输入区间和输出区间有重叠,则结果可能错误,也可能正确. (如果在内部采用的是memmov则正确)
集合运算,只能针对set/multiset, 不能针对hash_set, hash_multiset
set_intersection(交集), set_union(并集), set_difference(差集), set_symmetric_difference(即(S1-S2)U(S2-S1))
. 高级算法,都是针对vector存储结构的,很多都是对于有序的vector
** 查找
lower_bounder/upper_bounder, 折半查找某个值的,或最适合插入某值的位置
equal_range, 折半查找,返回lower_bounder和upper_bounder的一对
binary_search, 折半查找(调用lower_bounder)
** 排列组合
random_shuffle, 随即排列,排列是空间均匀分布的,采取的算法是"the art of programing"上面的
next_permutation/prev_permutation,前一个/后一个排列组合; (默认升序)
算法是:从后到前扫描,找到顺序的相邻的元素(ab), 然后从最后查找大于元素a的元素x,将a和x交换位置, 最后将b以后的元素reverse(包括b)
** 排序
sort, 采用了introsort(数目小时,采用插入排序;否则采用快速排序,如果快速排序递归太深则采用heap处理), O( n*log(n) )
stable_sort, 当比较小的数目时(小于阀值threshold),采用插入排序;否则,采用归并排序(merge,需要缓冲中间结果,故空间方面不联想)
inplace_merge, 将两个连接在一起的序列合并排序
partial_sort/partial_sort_copy, 采取heap方式, 将后半部分pop到后面,在将前半部分heap_sort
nth_element, 比partial_sort更少的保证,不知道能用在什么地方
** 分区
stable_partition, 稳定的分区
partition,分区(不稳定)
而vector/heap,是线形空间,++/--是会出问题的;所以一定要预先考虑到
heap堆的特点: 第一个是最大元素, de/add一个元素时间复杂度为log(n)
make_heap(将数据转换为堆,调整整个堆), sort_heap(将堆有序序列化存储,这样就不是堆了;否则就一直是以堆的结构存在), push_heap(针对最后元素,调整堆的有关部分), pop_heap(将最大元素移到最后,调整堆的有关部分)
. 质变算法(mutating algorithms) & 非质变算法(nonmutating algorithms)
质变算法: copy, swap, replace/replace_copy, fill, remove, permutation, partition, random_shuffling, sort
非质变算法: find, search, count, for_each, equal/mismatch, max/min
. 前闭后开区间, STL一般都是这种形式!
如果, STL的泛型函数的两个参数市一对iterator,称为first,last
STL习惯采用前闭后开的区间表示,即: [ first, last )
. 数值算法 (numeric).
accumulate(累计运算), inner_product(内积运算), adjacent_difference(两个相邻元素运算), partial_sum(前i个累计运算)
其中所有的运算部分都可以用仿函数来代替. e.g., minus<int>, plus<int>()
. 算法(algorithm).
如果参数形式为( first1, last1, first2 ), 即:区间1,区间2; 那么默认的结束的条件为:区间1-->直到last1;那么如果区间2的数目小于区间1的数目,则出现的结果是未知的. 其中如果是list类型,则结果未知,程序不崩溃; 如果是vector类型,则程序可能崩溃
equal(枚举区间1的元素,和区间2比较)
fill(将区间所有元素置值为x), fill_n(将某段区间的前n个元素置值为x)
iter_swap(将游标所指的元素值交换), swap(将值交换)
min/max, mismatch(找到第一个元素值不同的位置pair;如果区间2比区间1短,结果就不可预料了)
lexicographical_compare(象比较字符串那样比较,而不是只比较较短的一个区间的元素数目)
copy, 如果输入区间和输出区间有重叠,则结果可能错误,也可能正确. (如果在内部采用的是memmov则正确)
集合运算,只能针对set/multiset, 不能针对hash_set, hash_multiset
set_intersection(交集), set_union(并集), set_difference(差集), set_symmetric_difference(即(S1-S2)U(S2-S1))
. 高级算法,都是针对vector存储结构的,很多都是对于有序的vector
** 查找
lower_bounder/upper_bounder, 折半查找某个值的,或最适合插入某值的位置
equal_range, 折半查找,返回lower_bounder和upper_bounder的一对
binary_search, 折半查找(调用lower_bounder)
** 排列组合
random_shuffle, 随即排列,排列是空间均匀分布的,采取的算法是"the art of programing"上面的
next_permutation/prev_permutation,前一个/后一个排列组合; (默认升序)
算法是:从后到前扫描,找到顺序的相邻的元素(ab), 然后从最后查找大于元素a的元素x,将a和x交换位置, 最后将b以后的元素reverse(包括b)
** 排序
sort, 采用了introsort(数目小时,采用插入排序;否则采用快速排序,如果快速排序递归太深则采用heap处理), O( n*log(n) )
stable_sort, 当比较小的数目时(小于阀值threshold),采用插入排序;否则,采用归并排序(merge,需要缓冲中间结果,故空间方面不联想)
inplace_merge, 将两个连接在一起的序列合并排序
partial_sort/partial_sort_copy, 采取heap方式, 将后半部分pop到后面,在将前半部分heap_sort
nth_element, 比partial_sort更少的保证,不知道能用在什么地方
** 分区
stable_partition, 稳定的分区
partition,分区(不稳定)