C++ algorithm

来源:互联网 发布:淘宝手机助手好用吗 编辑:程序博客网 时间:2024/06/04 22:51

算法库

算法库定义了用来实现各种功能的函数(如查找、排序、计数、修改等),都是针对指定范围内元素的操作。需要注意的是,元素的范围以 [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
在未指定类型的数组中搜索元素

0 0