c++ algorithm常用算法汇总
std::for_each(Iterator first, Iterator last, _Fn f)
对[first,last)的每个元素执行f,f可能会修改该元素
f可传入函数或者仿函数
class f{
public:void operator()(int& t){t *= t;}
};int main(){std::vector<int> v{1,2,3,4};std::for_each(v.begin(), v.end(), f());for(auto x:v){std::cout << x << ' ';}return 0;
}
输出:
1 4 9 16
std::transform(Iterator first, Iterator last, Iterator dest, _Fn f)
将[first,last)的元素t使用f,将f(t)插入dest(会覆盖原本的内容,且不会触发扩容机制,因此一定要预留够足够的capacity)
class f{
public:int operator()(int t){return t * t;}
};int main(){std::vector<int> v1{1,2,3,4};std::vector<int> v2{2,2};v2.resize(v1.size());std::transform(v1.begin(), v1.end(), v2.begin(), f());for(auto x : v2){std::cout << x << ' ';}return 0;
}
输出
1 4 9 16
std::transform(Iterator first1, Iterator last1, Iterator first2, Iterator dest, _Fn f)
将容器1的[first1,last1)的元素与容器2的[first2,first2+last1-first2)的元素对应使用二元函数f,并将返回值插入dest(同样是覆盖不扩容)
需要保证容器2的访问不越界
iterator std::find(iterator first, iterator last, T t)
在迭代器[frist,last)顺序查找第一个t,找到就返回t的迭代器,找不到则返回last
iterator std::find_if(iterator first, iterator last, _Fn f)
在[first,last)顺序查找第一个使f(t)为true的t,找到就返回其迭代器,找不到返回last
iterator std::adjacent_find(iterator first, iterator last, _Fn f)
在[first,last)顺序查找第一个自身a与其下一个元素b满足f(a,b)为true的a,找到就返回其迭代器,找不到返回last
bool std::binary_search(iterator first, iterator last, T t, _Fn comp = std::less<T>() )
在不传入comp时,默认对升序数组进行二分查找,其逻辑是取区间中点元素u,若u==t,返回u的迭代器;若!std::less<T>(a,b) 则查找右区间,否则查找左区间,因此该查找逻辑会对降序输出出错
想要查找降序数组,将comp传入std::greater<T>()即可
iterator std::lower_bound(iterator first, iterator last, const T& target, _Fn comp = std::less<T>() )
默认查找升序区间[first,last)中最小的大于等于target的值,返回其迭代器,不存在返回last
二分查找[frist,last),逻辑为
取区间中点元素u,若comp(u,target),则向右区间查找;否则向左区间查找。若不存在,返回last
iterator std::upper_bound(iterator first, iterator last, const T& target, _Fn comp = std::less_equal<T>() )
默认查找升序区间[first,last)中最小的大于target的值,返回其迭代器,不存在返回last
逻辑同upper_bound,只是comp的默认值不一样
size_t std::count(iterator first, iterator last, T t)
返回t在[frist,last)的计数
size_t std::count_if(iterator first, iterator last, _Fn f)
返回满足f为true的t在[first,last)的计数
void std::sort(iterator first, iterator last, _Fn comp = std::less<T>())
对[first,last)进行排序,默认降序,调用的是T的operator<进行比较
std::random_shuffle(iterator first, iterator last)
对[first,last)进行随机打乱
在C++ 14被弃用,在C++17被移除,改为使用shuffle(iterator first, iterator last, _Urng &&_Func)
Func 一般传入default_random_engine
std::merge(iterator first1, iterator last1, iterator first2, iterator last2, iterator dest _Pr comp = std::less<T>())
默认合并两个升序容器,合并结果输出到dest,dest要有足够的capacity
void std::reverse(iterator first, iterator last)
原地翻转[first,last)的元素
std::copy(iterator first, iterator last, iterator dest)
将[first,last)插入dest,dest需要有足够的capacity
std::replace(iterator first, iterator last, T obj, T des)
遍历[first,last),将所有obj替换成des
std::replace_if(iterator first, iterator last, _Fn f, T des)
遍历[first, last),将所有满足f为true的t替换为des
std::swap(T& a, T& b)
交换a和b
T std::accumulate(iterator first, iterator last, T init, _Fn f)
在<numeric>库中定义
遍历,令init = f(init, t),最后返回init
std::fill(iterator first, iterator last, T t)
将[first, last)的元素都设置为t
iterator std::set_intersection(iterator first1, iterator last1, iterator first2, iterator last2, iterator dest, _Pr comp = std::less<T>() )
求[first1,last1)与[first2,last2)的交集,并将交集填入dest(直接覆盖),并返回交集的end()(不是dest的end()),需要保证dest有足够的capacity
默认两个集合都要是升序,降序需要令comp = std::greater<T>()
iterator std::set_union(iterator first1, iterator last1, iterator first2, iterator last2, iterator dest, _Pr comp = std::less<T>() )
求并集
用法同set_intersection
iterator std::difference(iterator first1, iterator last1, iterator first2, iterator last2, iterator dest, _Pr comp = std::less<T>() )
求差集,即第一个容器存在,但第二个容器不存在的元素的集合
用法同set_intersection