算法库
算法库定义了用来实现各种功能的函数(如查找、排序、计数、修改等),都是针对指定范围内元素的操作。需要注意的是,元素的范围以 [first, last) 的形式指定,其中 last 指的是范围内最后一个元素的下一个元素。
不修改序列内容的操作
定义于头文件 < algorithm>
bool all_of( InputIt first, InputIt last, UnaryPredicate p );
bool any_of
bool none_of
检查一定范围之内,是否全部、存在或不存在元素使得谓词为true
谓词:char == ‘c’
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
将一个函数应用于某一范围的元素
typename iterator_traits::difference_type count( InputIt first, InputIt last, const T &value );
count_if
返回满足特定条件的元素的数量 int
mismatch ( InputIt1 first1, InputIt1 last1,InputIt2 first2 );
查找两个范围第一个不同元素的位置
bool equal( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 );
确定两个元素集合是否是相同的
InputIt find( InputIt first, InputIt last, const T& value );//等于value
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );//谓词为true
InputIt find_if_not( InputIt first, InputIt last, UnaryPredicate q );//谓词为false
查找满足特定条件的第一个元素
find_end ( ForwardIt1 first, ForwardIt1 last,ForwardIt2 s_first, ForwardIt2 s_last );
查找一定范围内最后出现的元素序列
find_first_of ( ForwardIt1 first, ForwardIt1 last,ForwardIt2 s_first, ForwardIt2 s_last );
查找元素集合中的任意元素
adjacent_find ( ForwardIt first, ForwardIt last );
查找彼此相邻的两个相同(或其它的关系)的元素
//找到t2中元素在test中第一次出现的位置,不像find函数只能找一个
it=search(test.begin(),test.end(),t2.begin(),t2.end());
//寻找首次连续出现2次7的位置
it=search_n(test.begin(),test.end(),2,7);
//寻找首次连续出现2次大于7的位置
it=search_n(test.begin(),test.end(),2,7,[](int i,int j){return i>j;});
会修改序列内容的操作
定义于头文件 < algorithm>
copy
copy_if
将某一范围的元素复制到一个新的位置
copy_n
复制一定数目的元素到新的位置
copy_backward
按从后往前的顺序复制一个范围内的元素
move
将某一范围的元素移动到一个新的位置
move_backward (C++11)
按从后往前的顺序移动某一范围的元素到新的位置
fill
将一个值赋给一个范围内的元素
fill_n
将一个值赋给一定数目的元素
transform
将一个函数应用于某一范围的元素
generate
将函数的结果保存于一个范围内
generate_n
保存函数的N次运行结果
remove
remove_if
删除满足特定条件的元素
remove_copy
remove_copy_if
复制一个范围内不满足特定条件的元素
replace
replace_if
将所有满足特定条件的元素替换为另一个值
replace_copy
replace_copy_if
复制一个范围内的元素,并将满足特定条件的元素替换为另一个值
swap
交换两个对象的值
swap_ranges
交换两个范围的元素
iter_swap
交换两个迭代器所指向的元素
reverse
将区间内的元素颠倒顺序
reverse_copy
将区间内的元素颠倒顺序并复制
rotate
将区间内的元素旋转
rotate_copy
将区间内的元素旋转并复制
random_shuffle
将范围内的元素随机重新排序
unique
删除区间内连续重复的元素
unique_copy
删除区间内连续重复的元素并复制
分块操作
is_partitioned
判断区间是否被给定的谓词划分
partition
把一个区间的元素分为两组
partition_copy (C++11)
将区间内的元素分为两组复制到不同位置
stable_partition
将元素分为两组,同时保留其相对顺序
partition_point (C++11)
定位已划分的区域的划分点
排序操作(针对已排序的范围)
定义于头文件 < algorithm>
is_sorted
检查区间元素是否按升序排列
is_sorted_until (C++11)
查找最大有序子区间
sort
将区间按升序排序
partial_sort
将区间内较小的N个元素排序
partial_sort_copy
对区间内的元素进行复制并部分排序
stable_sort
将区间内的元素排序,同时保持相等的元素之间的顺序
nth_element
将给定的区间部分排序,确保区间被给定的元素划分
二叉排序操作(针对已排序的范围)
定义于头文件 < algorithm>
lower_bound
返回指向第一个不小于给定值的元素的迭代器
upper_bound
返回指向第一个大于给定值的元素的迭代器
binary_search
判断一个元素是否在区间内
equal_range
返回匹配特定键值的元素区间
集合操作(针对已排序的范围)
定义于头文件 < algorithm>
merge
合并两个已排序的区间
inplace_merge
就地合并两个有序的区间
includes
如果一个集合是另外一个集合的子集则返回true
set_difference
计算两个集合的差集
set_intersection
计算两个集合的交集
set_symmetric_difference
计算两个集合的对称差
set_union
计算两个集合的并集
堆操作
定义于头文件 < algorithm>
is_heap
检查给定的区间是否为一个堆
is_heap_until
查找区间中为堆的最大子区间
make_heap
根据区间内的元素创建出一个堆
push_heap
将元素加入到堆
pop_heap
将堆中的最大元素删除
sort_heap
将堆变成一个排好序的区间
最小/最大操作
定义于头文件 < algorithm>
max
返回两个元素中的较大者
max_element
返回区间内的最大元素
min
返回两个元素中的较小者
min_element
返回区间内的最小元素
minmax
返回两个元素中的的较大者和较小者
minmax_element
返回区间内的最小元素和最大元素
lexicographical_compare
如果按字典顺序一个区间小于另一个区间,返回true
is_permutation (C++11)
判断一个序列是否为另一个序列的排列组合
next_permutation
按字典顺序产生区间内元素下一个较大的排列组合
prev_permutation
按字典顺序产生区间内元素下一个较小的排列组合
数字操作
定义于头文件 < numeric>
iota
用从起始值开始连续递增的值填充区间
accumulate
计算区间内元素的和
inner_product
计算两个区间元素的内积
adjacent_difference
计算区间内相邻元素之间的差
partial_sum
计算区间内元素的部分和
C 库
定义于头文件 < cstdlib>
qsort
排序范围内的未指定类型的元素
bsearch
在未指定类型的数组中搜索元素