<algorithm>

作者: downdemo | 来源:发表于2018-02-06 18:12 被阅读16次

*标注为C++11/14引入,范围为[first,last)

Non-modifying sequence operations

函数名 功能 形式 f
*all_of 检查范围内是否所有元素满足给定条件,返回一个bool all_of(v.begin(), v.end(), f) bool f(int i);f也可以是一个lambda
*any_of 检查范围内是否存在元素满足给定条件,返回一个bool any_of(v.begin(), v.end(), f) bool f(int i);f也可以是一个lambda
*none_of 检查范围内是否所有元素不满足给定条件,返回一个bool none_of(v.begin(), v.end(), f) bool f(int i);f也可以是一个lambda
for_each 遍历范围内元素,传给f执行 for_each(v.begin(), v.end(), f) void f(int i);f也可以是一个只有void operator()(int i){}的类对象
find 查找范围内是否存在30,若存在则返回第一个对应迭代器,否则返回尾迭代器 find(v.begin(), v.end(), 30)
find_if 查找范围内是否存在满足给定条件的元素,若存在则返回第一个对应迭代器,否则返回尾迭代器 find_if(v.begin(), v.end(), f) bool f(int i)
*find_if_not 查找范围内是否存在不满足给定条件的元素,若存在则返回第一个对应迭代器,否则返回尾迭代器 find_if_not(v.begin(), v.end(), f) bool f(int i)
find_end 范围2为范围1的最后的子序列,返回范围2首元素在范围1中的对应的迭代器,若未找到则返回范围1的尾迭代器,参数可以多一个自定义条件f find_end(v.begin(), v.end(), sub.begin(), sub.end(), f) bool f(int i, int j)
find_first_of 范围2为范围1的第一个子序列,返回范围2首元素在范围1中的对应的迭代器,若未找到则返回范围1的尾迭代器,参数可以多一个自定义条件f find_first_of(v.begin(), v.end(), sub.begin(), sub.end(), f) bool f(int i, int j)
adjacent_find 查找第一对相邻且相同的元素,返回后一个元素的迭代器,若未找到则返回尾迭代器,参数可以多一个自定义条件f adjacent_find(v.begin(), v.end(), f) bool f(int i, int j)
count 返回值为范围内30出现的次数 count(v.begin(), v.end(), 30)
count_if 返回范围内满足给定条件的元素出现的次数 count_if(v.begin(), v.end(), f) bool f(int i)
mismatch 返回范围内不匹配给定数组的两个不同的值组成的pair,参数可以多一个自定义条件f。如果都相同则内存溢出 mismatch(v.begin(), v.end(), arr, f) bool f(int i, int j)
equal 查找范围内的元素是否与数组完全相同,返回一个bool,参数可以多一个自定义条件f。如果元素数量不同则内存溢出 equal(v.begin(), v.end(), arr, f) bool f(int i, int j)
*is_permutation 查找范围内是否含有相同的元素,顺序和数量可以不同 is_permutation(v.begin(), v.end(), arr)
search 范围2为范围1的第一个子序列,返回范围2首元素在范围1中的对应的迭代器,若未找到则返回范围1的尾迭代器,参数可以多一个自定义条件f search(v.begin(), v.end(), sub.begin(), sub.end(), f) bool f(int i, int j)
search_n 查找范围内出现2个连续的30的的第一个30对应的迭代器,未找到则返回尾迭代器,参数可以多一个自定义条件f search_n(v.begin(), v.end(), 2, 30, f) bool f(int i, int j)

Modifying sequence operations

函数名 功能 形式 f
copy 把范围1的内容拷贝到设置好size的v中 copy(arr, arr+7, v.begin())
*copy_n 把arr的7个元素拷贝到设置好size的v中 copy_n(arr, 7, v.begin())
*copy_if 把满足条件的v中元素拷贝到b中,返回目标范围的尾迭代器 copy_if (v.begin(), v.end(), b.begin(), f) bool f(int i)
copy_backforward 把范围内元素逆序从后往前拷贝 copy_backward(v.begin(), v.begin()+5, v.end())
*move 把范围1的元素移动到bar中,或直接move整个容器 move(v.begin(), v.begin()+4, bar.begin());foo = std::move(bar)
*move_backforward 把范围1的元素逆序从后往前移动 move_backward (elems,elems+4,elems+5)
swap 交换元素或容器的全部内容 swap(x, y);swap(foo, bar)
swap_ranges 将范围1内的元素和bar对应数量的元素交换 swap_ranges(foo.begin()+1, foo.end()-1, bar.begin())
iter_swap 交换两个迭代器的元素 iter_swap(arr+1,v.begin()+2)
transform 对foo所有元素进行op_increase操作,拷贝到bar transform (foo.begin(), foo.end(), bar.begin(), op_increase);transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus<int>())
replace 把范围内的20换成99 replace(v.begin(), v.end(), 20, 99)
replace_if 把范围内满足条件的元素换成0 replace_if(v.begin(), v.end(), f, 0) bool f(int i)
replace_copy 把范围中的20以99拷贝到v(范围元素不变) replace_copy(arr, arr+8, v.begin(), 20, 99)
replace_copy_if 把范围内满足条件的元素以0拷贝到bar replace_copy_if (foo.begin(), foo.end(), bar.begin(), f, 0) bool f(int i)
fill 把范围内元素换成5 fill(v.begin(),v.begin()+4,5)
fill_n 把4个20拷贝到对应位置 fill_n(v.begin()+3,4,20)
generate 将f的执行结果拷贝到范围内 generate(v.begin(), v.end(), f) int f() { return (std::rand()%100); }
generate_n 将f的执行结果拷贝到指定位置开始的n个元素中 generate_n (arr, 9, f) int f()
remove 将范围内的20删除 remove(v.begin(), v.end(), 20)
remove_if 将范围内满足条件的元素删除 remove_if (v.begin(), v.end(), f) bool f(int i)
remove_copy 将范围内的20删除拷贝到v(范围元素不变) remove_copy (arr,arr+8,v.begin(),20)
remove_copy_if 将范围内满足条件的元素删除拷贝到v remove_copy_if (arr,arr+9,v.begin(),f) bool f(int i)
unique 去除重复元素,也可以自定义判断条件 unique(v.begin(), v.end());unique(v.begin(), v.end(),f) 默认为bool f(int i, int j) { return (i==j); }
unique_copy 去除范围内的重复元素拷贝到v,可以自定义判断条件 unique_copy(arr,arr+9,v.begin());unique_copy(arr,arr+9,v.begin(),f) 默认为bool f(int i, int j) { return (i==j); }
reverse 反转范围内元素 reverse(v.begin(),v.end())
reverse_copy 将反转的范围内元素拷贝到v reverse_copy(arr, arr+9, v.begin())
rotate 交换[first,middle)和[middle,last)两个范围内元素 rotate(v.begin(),v.begin()+3,v.end())
rotate_copy 将交换的结果拷贝到v rotate_copy(arr,arr+3,arr+7,v.begin())
random_shuffle 随机打乱范围内元素位置 random_shuffle(v.begin(),v.end());random_shuffle(v.begin(),v.end(), f) int f(int i) { return std::rand()%i;}
*shuffle 用随机数引擎打乱范围内元素位置 unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();shuffle(v.begin(), v.end(), std::default_random_engine(seed));

Partitions

函数名 功能 形式 f
*is_partitioned 检测范围是否按条件划分,返回一个bool is_partitioned(v.begin(),v.end(),f) bool f(int i)
partition 按条件划分范围,返回划分边界的迭代器,不保持元素初始相对位置 partition(v.begin(), v.end(), f) bool f(int i)
stable_partition 按条件划分,返回划分边界的迭代器,保持初始位置 stable_partition(v.begin(), v.end(), f) bool f(int i)
*partition_copy 范围内满足条件的划分到两个新容器内 partition_copy(v.begin(), v.end(), odd.begin(), even.begin(), IsOdd)
*partition_point 返回第一个不满足条件的迭代器,不存在则返回尾迭代器 partition_point(v.begin(),v.end(),IsOdd)

Sorting

函数名 功能 形式 f
sort 排序,默认用<排序,可以自定义条件 sort(v.begin(), v.end());sort(v.begin(), v.end(), f) bool f(int i,int j) { return (i<j); };struct myclass { bool operator()(int i,int j) { return (i<j);} } f;
stable_sort 稳定排序 同上 bool f(double i,double j){ return (int(i)<int(j)); }
partial_sort 前5个最小的元素从小到大排序,剩下的未排序 partial_sort(v.begin(), v.begin()+5, v.end());partial_sort(v.begin(), v.begin()+5, v.end(), f) bool f(int i,int j) { return (i<j); }
partial_sort_copy 把部分排序的结果拷贝到v partial_sort_copy(arr, arr+9, v.begin(), v.end());partial_sort_copy(arr, arr+9, v.begin(), v.end(), f) bool f(int i,int j) { return (i<j); }
*is_sorted 返回一个bool判断是否已排序 std::is_sorted(v.begin(),v.end())
*is_sorted_until 返回第一个未排序的迭代器,若不存在则返回尾迭代器 is_sorted_until(v.begin(),v.end())
nth_element 将第5大的元素放到第5的位置,比它小的在前,大的在后 nth_element(v.begin(), v.begin()+5, v.end());nth_element(v.begin(), v.begin()+5, v.end(), f) bool f(int i,int j) { return (i<j); }

Binary search

函数名 功能 形式 f
lower_bound 返回第一个大于等于20的元素的迭代器 lower_bound (v.begin(), v.end(), 20)
upper_bound 返回第一个大于20的元素的迭代器 upper_bound (v.begin(), v.end(), 20)
equal_range 返回一个part,part.first为lower_bound,part.second为upper_bound,如果f为>则相反 equal_range (v.begin(), v.end(), 20);equal_range (v.begin(), v.end(), 20, f) bool f(int i,int j) { return (i>j); }
binary_search 二分查找,返回一个bool binary_search (v.begin(), v.end(), 3);binary_search (v.begin(), v.end(), 3, f) bool f(int i,int j) { return (i<j); }

Merge

函数名 功能 形式 f
merge 将两个有序序列合并到v并排序 merge (first,first+5,second,second+5,v.begin())
inplace_merge 连接在一起的序列[first,middle)和[middle,last)都已排序,将其归并为单一有序序列 inplace_merge(v.begin(),v.begin()+5,v.end())
includes 返回一个bool,判断arr2是否为arr1的子集 includes(arr1,arr1+10,arr2,arr2+4);includes(arr1,arr1+10,arr2,arr2+4,f) bool f(int i,int j) { return (i<j); }
set_union 将两个集合的并集拷贝到v,返回并集元素数后一个迭代器 set_union(first, first+5, second, second+5, v.begin())
set_intersection 交集 同上
set_difference 范围1减去范围2的差集 同上
set_symmetric_difference 对称差 同上

Heap

函数名 功能 形式
push_heap 向堆中加一个元素 v.push_back(99);push_heap(v.begin(),v.end())
pop_heap 删除堆中最大元素 pop_heap(v.begin(),v.end())
make_heap 用指定范围造一个堆 make_heap(v.begin(),v.end())
sort_heap 堆排序 sort_heap(v.begin(),v.end())
*is_heap 判断是否为二叉堆结构,返回一个bool is_heap(v.begin(),v.end())
*is_heap_until 返回第一个破坏二叉堆结构的迭代器 is_heap_until(v.begin(),v.end())

Min/max

函数名 功能 形式 f
min 返回较小元素 min('a','z')
max 返回较大元素 max(3.3, 2.5)
*minmax 返回一个pair,pair.first为最小值,pair.second为最大值 auto result = minmax({1,2,3,4,5})
min_element 返回范围内最小值的迭代器 min_element(myints,myints+7);min_element(myints,myints+7,f) bool myfn(int i, int j) { return i<j; };struct myclass { bool operator() (int i,int j) { return i<j; }} f;
max_element 返回范围内最大值的迭代器 同上
*minmax_element 返回一个pair,pair.first为最小值的迭代器,pair.second为最大值的迭代器 auto result = std::minmax_element(v.begin(),v.end())

Other

函数名 功能 形式
lexicographical_compare 按字典序比较两个序列 lexicographical_compare(foo,foo+5,bar,bar+9, compare)
next_permutation 范围按字典序的下一个排列组合,若没有则返回false next_permutation(arr,arr+3)
prev_permutation 范围按字典序的上一个排列组合,若没有则返回false prev_permutation(arr,arr+3)

相关文章

  • <algorithm>

    *标注为C++11/14引入,范围为[first,last) Non-modifying sequence ope...

  • Read a story

    This is a lion. lt's big. lt's strong. lt has big teeth. ...

  • Mybatis中特殊符号转移

    1. 写法1 原符号替换符号<<<=<=>>>=>=<><>&&'&a...

  • Read a story

    lt's hot?? lt's cool here. lt's a hat. What's this? Do yo...

  • test

    <script>alert(1);</script>

  • 无标题文章

    <script>alert('hello’);</script>

  • 芯科通信招聘fw固件工程师

    职责描述 工作职责:lt;/pgt;lt;pgt;1、负责光模块firmware的软件设计、维护以及优化;lt;/...

  • 打卡第47天

    Attention is vitality. lt connects you with others. lt ma...

  • Listen and enjoy

    lt can be bitter. lt can be sweet. Sometimes it's black. ...

  • 2018-10-08

    线性系统的LT分析法一、数学角度1、对微分方程进行LT分析eg:同求LT变换得到2、对电路进行LT处理对于线性电路...

网友评论

    本文标题:<algorithm>

    本文链接:https://www.haomeiwen.com/subject/jqogzxtx.html