算法函数总结

算法函数的总结:算法函数不会改变容器内的个数,这个要注意,另外在给自定义的类用算法函数的时候,要注意细节,有些要定义好等于符号,小于符号,否则会出错

有很多函数都要注意一些细节,例如如果只指明一个区间的开始位置,则要注意越界的风险,有copy类的要注意容器的大小足够大

具体用法参考http://www.cplusplus.com/reference/algorithm/

all_of:如果所有元素都满足条件则返回true,如果有一个不满足则返回false

bVec = all_of(iVec.begin(), iVec.end(), [](int x) {return x > m; });

 

any_of:如果有一个元素满足条件,则返回true,否则返回false

bVec = any_of(iVec.begin(), iVec.end(), [](int x) {return x > m; });

 

none_of:如果所有的条件都不满足条件,则返回true,否则返回false

bVec = none_of(iVec.begin(), iVec.end(), [](int x) {return x > m; });

 

for_each:用来对容器进行某个操作,例如对容器内的元素输出

for_each(iVec.begin(), iVec.end(), [](auto x) {cout << x << " "; });

 

find:寻找容器某个区间某个元素,返回一个迭代器

it = find(iVec.begin(), iVec.end(), m);

 

find_if:寻找满足某个条件的第一个元素

it = find_if(iVec.begin(), iVec.end(), [](auto x) {return x & 1; });

 

find_if_not:寻找不满足某个条件的第一个元素

it = find_if_not(iVec.begin(), iVec.end(), [](auto x) {return x & 1;  });

 

find_end:查找子序列,返回最后一个子序列的开始元素的迭代器

it = find_end(iVec.begin(), iVec.end(), iDeque.begin(), iDeque.end());

 

find_first_of:寻找某个区间中一个元素,该元素存在于另一个区间

it = find_first_of(iVec.begin(), iVec.end(), iDeque.begin(), iDeque.end());

 

adjacent_find:寻找一个区间中相邻且相等的元素,返回第一个元素的迭代器

it = adjacent_find(iVec.begin(), iVec.end());

 

count:寻找容器中的某个元素的个数

iCount = count(iVec.begin(), iVec.end(), m);

 

count_if:寻找容器中满足某个条件的元素的个数

iCount = count_if(iVec.begin(), iVec.end(), [](int x) {return x & 1; });

 

miamatch:依次比较两个序列的元素每个元素,返回第一对不相等的元素,该函数只有三个参数,第一个,第二个代表一个序列范围,第三个代表另一个序列的起始位置,返回的是一个pair类型分别指向不相等的两个数

iVecPair = mismatch(iVec.begin(), iVec.end(), iVec2.begin());

equal:和miamatch的用法一样,返回的是一个bool

bVec = equal(iVec.begin(), iVec.end(), iVec2.begin());

 

is_permutation:判断两个序列中元素是否相等,不考虑元素的顺序

bVec = is_permutation(iVec.begin(), iVec.end(), iVec2.begin());

 

search:查找第一个子序列,返回开始位置

it = search(iVec.begin(), iVec.end(), iVec2.begin(), iVec2.end());    

 

search_n:查找连续n个等于m值;如果有排序规则,查找连续n个满足某个条件的元素位置,拉姆达表达式里的第二个参数都为m,没有任何用,只需保持类型一样即可

it = search_n(iVec.begin(), iVec.end(), n, m);

it = search_n(iVec.begin(), iVec.end(), n, m,[](int x, int y) { return !(x & 1); });

 

copy:将一个区间的元素复制到另一个区间

copy(iVec.begin(), iVec.end(), iVec2.begin());

 

copy_n: 从序列的某个地方开始,复制连续 n 个元素,到另一个序列,需要保证源序列和目标序列都有足够的元素

copy_n(iVec.begin(), m, iDeque.begin());

 

copy_if:将满足条件的元素,复制到另一个序列中

copy_if(iVec.begin(), iVec.end(), iDeque.begin(), [](auto x) {return x & 1; });

 

copy_backward:将第一个区间的元素复制到另一个区间的后面,第三参数为结束的位置

copy_backward(iVec.begin(), iVec.begin() + m, iDeque.end());

 

move:移动元素,与copy的用法差不多

move(iVec.begin(), iVec.end() - 1, iVec.begin() + 1);

 

move_backward: 将第一个区间的元素移动到另一个区间的后面,第三参数为结束的位置

move_backward(iVec.begin(), iVec.begin() + 4, iDeque.end());

 

swap:交换两个迭代器

swap(iIt1, iIt2);

 

swap_ranges:交换一段区间的值

swap_ranges(iVec.begin(), iVec.end(), iVec2.begin());

 

iter_swap:交换两个迭代器所指向的值

iter_swap(iIt1, iIt2);

 

transform:对一个区间内的元素做某种操作,然后复制到另一个区间中,原来的区间不变

transform(iVec.begin(), iVec.end(), iVec2.begin(), [](auto x) {return x * 2; });

 

 

replace:将一个区间中的某个元素替换为某个值

replace(iVec.begin(), iVec.end(), 11, 1);

 

replace_if:将一个区间中满足某个条件的元素替换为某个值

replace_if(iVec.begin(), iVec.end(), [](auto x) {return x & 1; }, 0);

 

replace_copy:将替换后的序列复制到另一个区间中,原区间的元素不变

replace_copy(iVec.begin(), iVec.end(), iVec2.begin(), 222, 999);

 

replace_copy_if: 将满足条件的元素替换,替换后的序列复制到另一个区间中,但原区间的元素不变

replace_copy_if(iVec.begin(), iVec.end(), iVec2.begin(), [](auto x) {return x & 1; }, 0);

 

fill:对某个区间用m进行填充

fill(iVec.begin(), iVec.end() - 3, m);

 

fill_n:从某个某个迭代器开始n个值填充为m

fill_n(iVec.begin(), n, m);

 

generate:按照某种规则设置区间的值

generate(iVec.begin(), iVec.end(), []() {return 5; });

 

generate_n:按照某种规则,设置从起始位置开始第n个元素的值

generate_n(iVec.begin(), n, []() {return 10; });

 

remove:删除元素,但不是真正意义上的删除,因为算法函数不能改变容器内的元素,它只是将要删除的元素用后面的函数替换,最后返回一个迭代器,这个迭代器是结束的位置,从起始位置到这个迭代器之间是删除元素都得正确区间

it = remove(iVec.begin(), iVec.end(), 55);

 

remove_if:将满足条件的元素删除,删除的意义跟上面的类似

it = remove_if(iVec.begin(), iVec.end(), [](auto x) {return x & 1; });

 

remove_copy: 删除元素,把删除后的正确的区间复制到另一个区间中,原来的区间元素并没有变

remove_copy_if: 将满足条件的元素删除,把删除后的正确的区间复制到另一个区间中,原来的区间元素并没有变

 

 

 

unique:删除一个区间中的相邻且相等的元素,删除的意义跟上面的类似

it = unique(iVec.begin(), iVec.end());

unique_copy: 删除一个区间中的相邻且相等的元素,将正确的区间复制到另一个区间中,原来的区间元素没有变

 

reverse:将一个区间逆序

reverse(iVec.begin(), iVec.end());

 

reverse_copy: 将一个区间逆序,逆序后的结果复制到另一个区间中

 

rotate:将一个区间旋转,将第一个参数到第二参数的范围(不包括第二个参数的值)

旋转到后面

rotate(iVec.begin(), iVec.begin() + 3, iVec.end());

 

rotate_copy:将旋转后的区间复制到另一个区间中,原来区间的元素没有变

 

random_shuffle: 将一个序列按照自定义的规则进行随机重排,它的随机规则是从序列的第二元素开始到最后,当前元素与第n+1个元素交换,第三个参数的规则不能返回二以及二以上的数

random_shuffle(iVec.begin(), iVec.end(), [](auto x) {return n; });

 

shuffle:将一个序列进行随机重排

shuffle(iVec.begin(), iVec.end(), default_random_engine(time(NULL)));

 

is_partitioned:判断一个区间是否按照某种条件排序好了

cout << (is_partitioned(iVec.begin(), iVec.end(), [](auto x) {return x & 1; })

                   ? "is_partitioned" : "not_is_partitioned") << endl;

 

partition:将一个序列按条件进行分类,满足条件的放在前面,不满足条件的放在后面

partition(iVec.begin(), iVec.end(), [](auto x) {return x & 1; });

 

stable_partition:稳定排序,将一个序列按条件进行分类,满足条件的放在前面,不满足条件的放在后面

stable_partition(iVec.begin(), iVec.end(), [](auto x) {return x & 1; });

 

partition_copy: 将一个序列按条件进行分类,满足条件的放在前面,不满足条件的放在后面

,将排序后的结果复制到另一个容器中,原来的序列不变

 

partition_point:找出一个序列中的分界点,左闭右开原则,返回第一部分的右迭代器

cout << "iVec的分界点为:" << *(partition_point(iVec.begin(), iVec.end(), [](auto x) {return x & 1; })) << endl;

 

sort:将一个区间进行排序,可以自定义排序规则

sort(iVec.begin(), iVec.end());

 

stable_sort: 稳定排序,将一个区间进行排序,可以自定义排序规则

 

 

partial_sort:不是部分排序的意思,是排出前面若干个元素,后面的元素就不管了

partial_sort(iVec.begin(), iVec.begin() + m, iVec.end());

 

partial_sort_copy: 排出前面若干个元素,后面的元素就不管了,然后将其复制到另一个区间,原来的区间元素没有变化

partial_sort_copy(iVec.begin(), iVec.end(), iVec2.begin(), iVec2.begin() + 5);

 

is_sorted:判断一个区间内的元素是否排序好了

cout << (is_sorted(iVec2.begin(), iVec2.end()) ? "is_sort" : "not_is_sort") << endl;

 

is_sorted_until:查找第一个不满足排序规则的元素

cout <<  *(is_sorted_until(iVec2.begin(), iVec2.end())) << endl;

 

lowed_bound:寻找大于或者等于的某个值的元素位置(如果是降序的话,寻找小于或者等于的)

it = lower_bound(ivec.begin(),ivec.end(),m);

 

upper_bound: 寻找大于的某个值的元素位置(如果是降序的话,寻找小于的)

it2 = upper_bound(ivec.begin(), ivec.end(), m);

 

equal_range:寻找某个值,返回一个pair类型,分别为lowed_bound和upper_bound,指定它的范围

itpair = equal_range(ivec.begin(),ivec.end(),m);

 

binary_search:二分法查找,序列必须满足升序排序或者是降序排序

bvec=binary_search(ivec.begin(),ivec.end(),m);

 

merge:归并排序,两个都是要有序的,并且需要目标容器大小要足够大

merge(ivec.begin(), ivec.end(), ivec2.begin(), ivec2.end(),ivec3.begin());

 

inplace_merge:在一个容器内部进行归并排序,前半部分和后半部分都必须是有序的

inplace_merge(ivec3.begin(), it, ivec3.end());

 

includes:判断一个序列是否包含另一个序列,要求两个序列都需要有序的

bvec = includes(ivec3.begin(),ivec3.end(),ivec.begin(),ivec.end());

 

set_union:获得两个序列中并集的部分存到第三个序列中

it=set_union(ivec.begin(), ivec.end(), ivec2.begin(), ivec2.end(), ivec3.begin());

 

set_intersection: 获得两个序列中交集的部分存到第三个序列中

it = set_intersection(ivec.begin(), ivec.end(), ivec2.begin(), ivec2.end(), ivec3.begin());

 

set_difference: 获得两个序列中差集的部分存到第三个序列中

it = set_difference(ivec.begin(), ivec.end(), ivec2.begin(), ivec2.end(), ivec3.begin());

 

set_symmetric_difference: 获得两个序列中对称差集的部分存到第三个序列中

 

 

push_heap:添加一个元素,并调整堆的结构,成为一个大堆或者小堆

push_heap(ivec.begin(), ivec.end(), greater<int>());

 

pop_heap:删除一个元素,并调整堆的结构,成为一个大堆或者小堆

pop_heap(ivec.begin(), ivec.end(), greater<int>());

 

make_heap: 把序列构造成堆结构

make_heap(ivec.begin(),ivec.end(),greater<int>());

 

sort_heap:堆一个区间进行堆排序

sort_heap(ivec.begin(), ivec.end(), greater<int>());

is_heap:判断一个序列是否为堆排序

bVec=is_heap(ivec.begin(),ivec.end(), greater<int>())

 

is_heap_until:找到第一个不满足堆排序的元素

由于算法函数并不会改变容器内的元素个数,所以在使用push_heap之前先用push_back添加一个元素,使用pop_heap后使用pop_back

 

posted @ 2017-03-09 09:39  菜鸟也有高飞的时候  阅读(711)  评论(0编辑  收藏  举报