C++菜鸟学习笔记——算法篇

来源:互联网 发布:优惠券查询系统源码 编辑:程序博客网 时间:2024/06/03 15:58

闲来没事,将书上的算法总结了下:

 A.查找算法

简单查找:
find(beg,end,val);     //返回值为val的迭代器
count(beg,end,val);     //返回值为val的个数

find_if(beg,end,unaryPred);
count_if(beg,end,unaryPred);//与上面相同,只是要找出使unaryPred为真的值

find_first_of(beg1,end1,beg2,end2);
find_first_of(beg1,end1,beg2,end2,binaryPred);//返回(beg2,end2)中的任意元素在(beg1,end1)中的第一次出现
find_end(beg1,end1,beg2,end2);
find_end(beg1,end1,beg2,end2,binaryPred);//与上面相同,但是返回的是最后一次出现

查找子序列:
adjacent_find(beg,end);
adjacent_find(beg,end,binaryPred);//返回重复元素的第一个相邻对

search(beg1,end1,beg2,end2);
search(beg1,end1,beg2,end2,binaryPred);//在(beg1,end1)中查找(beg2,end2)子序列

B.其他只读算法
for_each(beg,end,fun);//对输入范围中的每个函数都使用fun函数(或函数对象),若fun有返回值,则忽略返回值

mismach(beg1,end1,beg2);
mismach(beg1,end1,beg2,binaryPred);//返回2个范围中第一个不匹配元素的迭代器

equal(beg1,end1,beg2);
equal(beg1,end1,beg2,binaryPred);//如果2个范围的元素相同,返回true

C.二分查找
lower_bound(beg,end,val);
lower_bound(beg,end,val,comp);//返回值为val第一个位置的迭代器

upper_bound(beg,end,val);
upper_bound(beg,end,val,comp);//返回值为val最后一个位置的迭代器

equal_range(beg,end,val);
equal_range(beg,end,val,comp);//...
以上3种均可以将val插入序列中,而顺序不变

binary_search(beg,end,val);
binary_search(beg,end,val,comp);//返回一个bool,检查范围中是否会有与val相同的元素

D.写容器元素的算法
fill(beg,end,val);//在(beg,end)中全部填入val
generate(beg,end,gen);//执行函数gen()来填充序列(beg,end)

fill_n(dest,cnt,val);
generate_n(dest,cnt,gen);//与上面差不度

copy(beg,end,dest);//将序列(beg,end)复制到迭代器dest开始的序列中

transform(beg,end,dest,unaryOp);//一元操作符
transform(beg1,end1,beg2,dest,binaryOp);//将序列进行指定操作后复制到目的序列dest,二元操作符

replace(beg,end,old_val,new_val);
replace(beg,end,unaryPred,new_val);//用新值代替旧值

replace_copy(beg,end,dest,old_val,new_val);
replace_copy(beg,end,dest,unaryPred,new_val);//将序列的每个元素复制到dest,并用新值代替旧值

merge(beg1,end1,beg2,end2,dest);
merge(beg1,end1,beg2,end2,dest,comp);//2个已排序序列合并,然后复制到dest

swap(elem1,elem2);
iter_swap(iter1,iter2);
swap_range(beg1,end1,beg2);//显然,交换

copy_backward(beg,end,dest);//逆序复制到dest

inplace_merge(beg,mid,end);
inplace_merge(beg,mid,end,comp);//将同一序列中的相邻2子序列合并成一个有序序列

E.划分与排序
划分:
stable_partition(beg,end,unaryPred);
partition(beg,end,unaryPred);//使unaryPred为真的放开头,为假的放末尾,返回一个迭代器,指向使unaryPred为真的最后元素的下一位

排序:
sort(beg,end);
stable_sort(beg,end);
sort(beg,end,comp);
stable_sort(beg,end,comp);//整个范围进行排序

partial_sort(beg,mid,end);
partial_sort(beg,mid,end,comp);//在整个范围找出前(beg,mid)排序,后面的(mid,end)是没有排序的

partial_sort_copy(beg,end,destbeg,destend);
partial_sort_copy(beg,end,destbeg,destend,comp);//排序,复制

nth_element(beg,nth,end);
nth_element(beg,nth,end,comp);//排序后的序列,nth前面的都比nth小,后面的都比nth大,前面或后面是没有顺序的

F.通用重新排序
remove(beg,end,val);
remove_if(beg,end,unaryPred);//移去元素,如输入为helloworld,val=‘0’,输出为hellwrldld,返回迭代器指向第一个d

remove_copy(beg,end,dest,val);
remove_copy_if(beg,end,dest,unaryPred);
-----------------------------------------------------------------
unique(beg,end);
unique(beg,end,unaryPred);//移去匹配元素的连续组,如输入为boohiss,输出为bohisss,返回第一个s之后的元素迭代器

unique_copy(beg,end,dest);
unique_copy(beg,end,dest,unaryPred);
-----------------------------------------------------------------
rotate(beg,mid,end);//如输入hissboo,mid为b,输出为boohiss,返回void

rotate_copy(beg,mid,end,dest);
-----------------------------------------------------------------
reverse(beg,end);
reverse_copy(beg,end,dest);//逆序
-----------------------------------------------------------------
random_shuffle(beg,end);
random_shuffle(beg,end,rand);//将序列随机排列

G.字典序的排列算法
next_permutation(beg,end);
next_permutation(beg,end,comp);//下一个排列
-----------------------------------------------------------------
prev_permutation(beg,end);
prev_permutation(beg,end);//上一个排列

H.有序序列的集合算法
includes(beg1,end1,beg2,end2);
includes(beg1,end1,beg2,end2,comp);//A包含B,返回true

set_union(beg1,end1,beg2,end2,dest);
set_union(beg1,end1,beg2,end2,dest,comp);//并集,A,B所有元素,但重复元素只出现一次

set_intersection(beg1,end1,beg2,end2,dest);
set_intersection(beg1,end1,beg2,end2,dest,comp);//交集,A,B中都存在元素的有序序列

set_difference(beg1,end1,beg2,end2,dest);
set_difference(beg1,end1,beg2,end2,dest,comp);//差集,A中有,B中没有的元素的有序集合

set_symmetric_difference(beg1,end1,beg2,end2,dest);
set_symmetric_difference(beg1,end1,beg2,end2,dest,comp);//并集的基础上去除公共部分的有序序列

I.最大/最小
min(val1,val2);
min(val1,val2,comp);
max(val1,val2);
max(val1,val2,comp);//值的比较

min_element(beg,end);
min_element(beg,end,comp);
max_element(beg,end);
max_element(beg,end,comp);//返回目标迭代器

J.算术算法
accumulate(beg,end,init);
accumulate(beg,end,init,binaryOp);//在初始值init下,输出序列的总和

inner_product(beg1,end1,beg2,init);
inner_product(beg1,end1,beg2,init,binOp1,binOp2);//2序列对应元素的乘积和
//如:(2,3,5,8),(1,2,3,4,5),结果:init+(2*1)+(3*2)+(5*3)+(8*4)

partial_sum(beg,end,dest);
partial_sum(beg,end,dest,binaryOp);//当前位置(不包含该位置)前得所有元素的和,累加和

adjacent_different(beg,end,dest);
adjacent_different(beg,end,dest,binaryOp);//除了第一个元素外,每个新元素都是当前元素与前一元素的差
原创粉丝点击