Algorithm算法库
algorithm算法可以通过迭代器或指针访问的任何对象序列,例如数组或某些STL容器的实例。但请注意,算法直接通过迭代器对值进行操作,不会以任何方式影响容器的结构(它永远不会影响容器的大小或存储分配)。
不修改序列的方法
bool all_of (first, last, pred) |
对范围 [first1,last1)内的所有测试pred函数,如果有一个pred返回false则中断并返回false |
bool any_of (first, last, pred) |
对范围 [first1,last1)内的所有测试pred函数,如果有一个pred返回true则中断并返回true |
bool none_of (first, last, pred) |
和all_of函数作用相反 |
Function for_each(first, last, fn) |
对范围 [first1,last1)内的所有应用fn函数,返回fn(fn的右值引用) |
InputIterator find (first, last, val) |
在范围 [first1,last1)内中寻找val,返回找到的第一个指针(迭代器) |
InputIterator find_if (first, last, pred) |
在范围 [first1,last1)内中寻找第一个符合测试函数pred的元素 |
InputIterator find_if_not (first, last, pred) |
与find_if相反 |
Iterator find_first_of (first1, last1,first2,last2) |
在first1到last1中寻找第一个first2到last2(最后子序列),可以在最后传入自定义函数 |
Iterator find_end (first1, last1,first2,last2) |
在first1到last1中寻找最后一个first2到last2(最后子序列),可以在最后传入自定义函数 |
Iterator adjacent_find (first, last) |
在范围内中寻找第一个两个元素连续的情况,返回指针 |
Int count (first, last, val); |
在范围内统计val出现的次数并返回 |
Int count_if (first, last, pred); |
在范围内统计符合判定函数pred的元素个数并返回 |
pair<InputIterator1, InputIterator2> mismatch (first1, last1, first2 ) |
寻找first1到last1序列和以first2开始的序列第一个不同的元素,返回不同时的两个指针的pair |
bool equal (first1, last1,first2); |
判断first1到last1序列和以first2开始的序列是否相同,可以在最后传入自定义函数 |
bool is_permutation (first1, last1,first2); |
判断first1到last1序列和以first2开始的序列是否互为排列,可以在最后传入自定义函数,只要元素相同就可以,即使顺序不同 |
ForwardIterator1 search (first1, last1, first2, last2); |
在 [first1,last1)中寻找第一个 [first2,last2), 并返回匹配的元素开头,可以在最后传入自定义函数 |
ForwardIterator search_n (first, last, count, val); |
在 [first1,last1)中寻找第一个连续的count个val,并返回匹配的元素开头,可以在最后传入自定义函数 |
修改序列的方法
Iterator copy (first, last, Iterator result) |
将 [first,last) 复制到以 result开头的相同范围中,目标范围中的迭代器,指向最后移动的元素。 |
Iterator copy_n (first, n, Iterator result) |
将first开头的n个元素复制到result开头的n个元素中 |
OutputIterator copy_if (first, last,result, pred); |
将范围中的符合pred的元素复制到result中 |
Iterator copy_backward (first,last,result); |
将范围内的元素复制带以result结束的范围中 |
Iterator move (first, last, result); |
移动范围 [first, last) 中的元素到始于 result的另一范围 |
Iterator move_backward(first, last, result); |
移动来自范围 [first, last) 的元素到终于 d_last 的另一范围 |
void fill(first, last, value ); |
赋值value 给 [first, last) 中的元素。 |
void fill_n(first, count, value ); |
赋值value 给 first开头的count个元素。 |
一、Iterator transform(first1, last1, d_first, unary_op ); 二、Iterator transform(first1, last1, first2, d_first, binary_op ); |
一、应用一元函数 unary_op 到 [first1, last1) 所定义的范围。 二、应用二元函数 binary_op 到来自二个范围的元素对:一个以 [first1, last1) 定义,而另一个始于 first2 。 |
void generate(first, last, Generator g ); |
多次调用函数g(),填充范围 [first, last) |
void generate_n(first, count, Generator g ); |
多次调用函数g(),填充范围 [first, first+count) |
ForwardIt remove(first, last, value ); |
移除 [first, last) 中的全部value 移除满足特定标准的元素 ,如果p(元素)==true则移除此元素 |
Iterator remove_copy(first, last, d_first, value ); |
复制一个范围内不满足特定条件的元素 |
void replace(first, last,old_value, new_value ); |
将所有满足特定条件的元素替换为另一个值 |
OutputIt replace_copy(first, last, d_first, old_value, new_value ); replace_copy_if |
复制一个范围内的元素,并将满足特定条件的元素替换为另一个值 |
void swap( T& a, T& b ); |
交换两个对象的值 ,例如数组或容器 |
ForwardIt2 swap_ranges(first1, last1, first2 ); |
交换两个范围的元素 |
void iter_swap( ForwardIt1 a, ForwardIt2 b ); |
交换两个迭代器所指向的元素 |
void reverse( BidirIt first, BidirIt last ); |
将区间内的元素颠倒顺序 |
OutputIt reverse_copy(first, last, d_first ); |
将区间内的元素颠倒顺序并复制 到d_first开始的区域中 |
ForwardIt rotate(first, n_first, last ); // 简单地旋转到左侧 std::rotate(v.begin(), v.begin() + 1, v.end()); // 简单地旋转到右侧 std::rotate(v.rbegin(), v.rbegin() + 1, v.rend()); |
将区间内的元素旋转 |
OutputIt rotate_copy(first, n_first, last, d_first ); |
将区间内的元素旋转并复制 到d_first开始的区域中 |
void random_shuffle(first, last ); |
将范围内的元素随机重新排序 |
ForwardIt unique(first, last ); |
删除区间内连续重复的元素 |
OutputIt unique_copy(first, last, d_first ); |
删除区间内连续重复的元素并复制 |
划分操作
bool is_partitioned(first, last, p ); |
若在范围中的所有满足p的元素都出现在所有不满足的元素前则返回 true |
bool partition(first, last, p ); |
重排序范围 [first, last) 中的元素,使得谓词 p 对其返回 true 的元素前于谓词 p 对其返回 false 的元素。 |
std::pair<OutputIt1, OutputIt2> partition_copy( InputIt first, InputIt last, OutputIt1 d_first_true, OutputIt2 d_first_false, UnaryPredicate p ); |
将范围 [first, last)中的元素通过谓词p判断,满足的放到d_first_true,不满足的放到d_first_false,最后返回指向两个输出序列的末尾的指针 |
BidirIt stable_partition(first, last, p ); |
重排序范围 [first, last) 中的元素,使得所有谓词 p 对其返回 true 的元素先于谓词 p 对其返回 false 的元素 |
ForwardIt partition_point(first, last, p ); |
返回范围[first, last) 内第一划分结尾后的迭代器,或若所有元素满足 p 则为 last 。 |
排序操作
void sort(first, last ); void sort(first, last, comp ); |
以升序排序范围 [first, last) 中的元素。不保证维持相等元素的顺序。可以提供比较函数 |
void stable_sort(first, last ); |
稳定排序,以升序排序范围 [first, last) 中的元素。保证保持等价元素的顺序。 |
void nth_element(first, nth, last ); |
它重排 [first, last) 中元素,使得: nth 所指向的元素被更改为假如 [first, last) 已排序则该位置会出现的元素。 这个新的 nth 元素前的所有元素小于或等于新的 nth 元素后的所有元素。 |
void partial_sort(first, middle, last ); |
重排元素,使得范围 [first, middle) 含有范围 [first, last) 中已排序的 middle - first 个最小元素。 不保证保持相等的元素顺序。范围 [middle, last) 中剩余的元素顺序未指定。 |
RandomIt partial_sort_copy(first, last, d_first, d_last ); |
以升序排序范围 [first, last) 中的某些元素,存储结果于范围 [d_first, d_last) 。 至多将 d_last - d_first 个元素放置并排序到范围 [d_first, d_first + n) 中。其中 n 是要排序的元素数( n = min(last - first, d_last - d_first) )。不保证保持相等元素的顺序。 |
bool is_sorted(first, last ); |
检查 [first, last) 中的元素是否以升序排序。 |
ForwardIt is_sorted_until(first, last ); |
寻找始于 first 且其中元素已以升序排序的最大范围,返回第一个不再上升的元素指针 |
二分搜索操作(在已排序范围上)
ForwardIt lower_bound(first, last, value ); |
返回指向范围 [first, last) 中首个不小于value 的元素的指针,若找不到这种元素则返回 last 。 |
ForwardIt upper_bound(first, last, value ); |
返回指向范围 [first, last) 中首个大于value 的元素的指针,若找不到这种元素则返回 last 。 |
bool binary_search(first, last, value ); |
返回在范围 [first, last)中是否有值value |
std::pair<ForwardIt,ForwardIt> equal_range(first, last,value ); |
返回范围内等于value的元素范围,可以给定比较函数 return make_pair( lower_bound(first, last, value),upper_bound(first, last, value)); |
集合操作(在已排序范围上)
OutputIt merge(first1, last1,first2, last2, OutputIt d_first ); |
合并两个已排序的区间 到d_first中,返回合并后的最后一个元素指针 |
void inplace_merge(first, middle, last ); |
就地合并两个有序的区间 ,middle是第一序列的结束也是第二序列的开头,也就是两个序列要连续 |
bool includes(first1, last1,first2, last2 ); |
如果一个集合是另外一个集合的子集则返回true |
OutputIt set_difference(first1, last1,first2, last2, OutputIt d_first ); |
计算两个集合的差集 ,放到d_first中,可以给定比较函数 |
OutputIt set_intersection(first1, last1, first2, last2,OutputIt d_first ); |
计算两个集合的交集 ,放到d_first中,可以给定比较函数 |
OutputIt set_symmetric_difference(first1, last1, first2, last2,OutputIt d_first ); |
计算两个集合的对称差 ,复制两个集合各自的非交集部分,到d_first |
OutputIt set_union( first1, last1,first2, last2, OutputIt d_first ); |
计算两个集合的并集 ,放到d_first中 |
堆操作
bool is_heap( RandomIt first, RandomIt last ); |
检查给定的区间是否为一个堆 ,可加入比较函数 |
RandomIt is_heap_until(first, last ); |
返回始于 first 且为最大堆的最大范围界 |
void make_heap(first, last ); |
根据区间内的元素创建出一个堆 |
void push_heap(first, last ); |
将元素加入到堆 |
void pop_heap(first, last ); |
将堆中的最大元素删除,不返回 |
void sort_heap(first, last ); |
将堆变成一个排好序的区间 |
最小/最大操作
const T& max( const T& a, const T& b ); T max( std::initializer_list<T> ilist ); |
返回两个元素中的较大值 ,或是序列中的最大值 |
ForwardIt max_element(first, last ); |
返回区间内的最大元指针 |
返回两个元素中的较小值 ,或是序列中的最小值 |
|
返回区间内的最小元素 |
|
std::pair<const T&,const T&> minmax( const T& a, const T& b ); std::pair<T,T> minmax( std::initializer_list<T> ilist); |
返回两个元素中的较大者和较小者组成的pair |
返回区间内的最小元素和最大元素 |
|
bool lexicographical_compare( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 ); |
如果按字典顺序一个区间小于另一个区间,返回true ,可以传入比较函数 |
bool is_permutation(first1, last1, first2, last2 ); |
若存在范围 [first1, last1) 中元素的排列,使得该范围等于 [first2,last2) ,则返回 true |
bool next_permutation( BidirIt first, BidirIt last ); |
按字典顺序产生区间内元素下一个较大的排列组合 |
bool prev_permutation( BidirIt first, BidirIt last); |
按字典顺序产生区间内元素下一个较小的排列组合 |
参考:
https://zh.cppreference.com/w/cpp/container
http://www.cplusplus.com/reference/algorithm/
本文的word版本已放出,方便打印