C++STL算法函数总结

时间:2021-10-04 13:11:15

容器自己定义了的算法
vector:swap
list:swap,merge,splice,remove,remove_if,reverse,unique
deque:swap
map,set,multiset,multimap:find,count,lower_bound,upper_bound,equal_bound(返回pair<lower_bound,upper_bound>)

all_of
any_of
none_of
for_each
find(it.b,it.e,val)
find_if
find_if_not
find_end(it1.b,it1.e,it2.b,it2.e) 找最后一个子列(it2是子列)。返回子列开始位置迭代器

find_first_of(it1.b,it1.e,it2.b,it2.e) 找第一个存在于子列中的元素(不是找第一个子列):  遍历it1中的元素。当找到一个元素存在于it2中就结束。返回指向此元素的迭代器

adjacent_find 找到第一对相等元素返回迭代器
count
count_if 使用方法跟find类似
mismatch 找两个容器中对应位置第一个不相等元素的位置(返回 pair<it1, it2>)
mismatch(it1.b,it1.e,it2.b) 实现里没有对it2判断是否到it2.end,如果it2.size()比it1.size()小的话。编译器会报错
因此要把较长的容器放在第三个参数里
equal(it1.b,it1.e,it2.b) 如果2个容器对应位置元素相等返回true
同mismatch 要把较长的容器放在第三个参数里
is_permutation(it.b,it.e,it2.b) 判断2个容器的元素,全相等返回true
不看顺序,只比较元素,只比较it.size()个。如果it.size()比it2.size()大。肯定返回false
search 与find_end一样.不过是找第一个子列
search_n 找连续n个满足条件的:search_n(iVec.b,iVec.e,3,4); 找连续3个4的位置(要连续),返回指向第一个4的位置的迭代器
copy(it.b,it.e,it2.b) 拷贝第一个区间到第二个容器.要保证第二个容器比1大,不然会报错
copy_n(it.b,n,it2.b) 拷贝it.b开始n个长度的元素到it2.b
copy_if(it.b,it.e,it2.b,pre)/pre是条件。把it.b到it.e的元素满足pre的拷贝到it2
copy_backward(it.b,it.b+3,it2.e) 从后往前拷贝.将it.b+3到it.b的元素拷贝到it.e-1开始3个 .it--

swap 交换数据
swap_range 交换一段区间内数据
iter_swap 交换迭代器
transform 对第一个容器的元素处理。处理之后存入另一个容器

replace 相等则替换元素
replace(it.b,it.e,old val,new val)
replace_if 满足条件则替换
replace(it.b,it.e,pre,new val)
replace_copy 复制元素到第二个容器,相等则替换第二个容器元素
replace_copy_if 复制元素到第二个容器,满足条件则替换第二个容器元素

fill 把容器区间内的元素赋值(会把原数据修改了)
fill(it.b,it.e,val)
fill_n(it,n,val) 把容器某个位置开始连续N个元素赋值

generate(it.b,it.e,fun) 用函数返回值给区间赋值
generate_n(it.b,n,fun) 用函数返回值从某位置开始n个元素赋值

remove 删除元素(所有) 返回一个迭代器。指向容器最后的后一个位置(容器size不变。所以返回的迭代器后面还有数据)
remove_if
remove_copy 复制元素到第二个容器,相等则删除(如果此容器个数比第一个容器移除数据后的个数要多。后面还会有数据)
remove_copy_if

unique 把相邻重复的元素删除。一般先sort在unique(所有相邻重复)
unique_copy

reverse 将容器区间内元素逆序
reverse_copy

rotate(it.b,it.b+1,it.e) 将容器区间内元素旋转
其实就是将b-b+1的元素放到it.e前
rotate_copy

random_shuffle //将元素随机重排(一般使用这个)
shuffle
srand(GetTickCount())//设置随机数种子((GetTickCount()在windows.h头文件)
random_shuffle(it.b,it.e,[](int a){return rand()%a;});

partition(it.b,it.e,pre) 按规则分割容器。前半部分是满足条件的。后半部分不满足条件
is_partitioned(it.b,it.e,pre) 是否按规则划分好。返回bool
stable_partiton 稳定划分
partition_copy(it.b,it.e,it2.b,it3.b,pre)
划分好存入另外俩个容器(一个装满足条件,另一个存不满足条件)原容器不变
partition_point  返回false的第一个位置迭代器

sort
stable_sort 稳定排序

partial_sort(it.b,it.n,it.e) 将b到e全部排序只取前n个(实现是用堆排序)
如果只排前N个是sort(it.b,it.n)

partial_sort_copy(it1.b,it1.e,it2.b,it2.e) 结果存入另一个容器
it1.b到it.e表示要排序的区间.it2.b,it.e是只取的区间
partial_sort_copy(s.b,s.e,d.b,d.b+3)//将s所有元素排序,取前3个拷贝到d里

is_sorted 是否排序,返回bool
is_sorted_until !!返回迭代器 (其实就是遍历容器元素,遇到没排序元素就结束) 对应partial_sort

nth_element(it.b,it.n,it.e) 找第n小的元素并把他放在第n个位置(在vs里面他还是全部排序了)

lower_bound 查找第一个大于等于某个元素值的位置
upper_bound 查找第一个大鱼某个元素值的元素
equal_range pair<iter,iter>
binary_search 二分查找元素

/都要先排序
merge 合并两个容器(必须2个容器元素有序且规则一致),存入第三个容器,原容器不变
merge(it1.b,it1.e,it2.b,it2.e,it3)

inplace_merge 对一个容器内的两部分数据归并(需要保证两部分数据分别有序)

includes(it1.b,it1.e,it2.b,it2.e) (it1跟it2必须有序)判断it1是否包含it2(it1>=it2)返回bool

set_union 去掉重复元素后合并(重复部分还会取一份)
set_intersection 取两个容器交集(只取重复部分)
set_difference(it1.b,it1.e,it2.b,it2.e,it3.b)取两个容器差集(取it1部分的差集)
set_symmetric_difference 取对称差集(不相交集)

/

make_heap 堆化容器

push_heap 往堆化容器内添加元素(要先堆化才能用)
Vect.push_back
push_heap(vect.b,vec.e)

pop_heap 从堆化容器内弹出元素,!!不会删除元素(要先堆化才能用)
pop_heap会做2件事
1.首位交换
2.把首元素下沉

sort_heap 堆排序(对已经堆化的容器进行排序)
is_heap 容器是否堆化
is_heap_until 判断容器前面N个元素是否堆化

min 求两个元素最小值,入参是值,返回值也是值
max
minmax 求区间的最小最大值返回的是pair<minVal,maxVal>,返回的是值的pair类型
min_element 求区间内元素最小值,入参是迭代器,返回值也是迭代器
minmax_element 求区间的最小最大值返回的是pair<it1,it2>,返回的是迭代器的pair类型

lexicographical_compare 字典比较数据,比较规则同两个字符串比较一样
(it1.b,it1.e,it2.b,it2.e)只比较it1.b和it2.b。it1.b<t2.b返回true
next_permutation 按照某个具体规则重排容器内元素
prev_permutation 按照某个具体规则重排容器内元素
互为逆运算,都调用一次的话,容器元素位置不变