当前位置: 首页 > news >正文

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>库中定义

遍历t\in[first,last),令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

http://www.dtcms.com/a/251937.html

相关文章:

  • 13分钟讲解主流Linux发行版
  • 数据库优化实战分享
  • 设备健康管理系统搭建全技术解析:从架构设计到智能运维实践
  • Flink CDC MySQL 时区相差 8 小时问题优雅解决方式
  • 华为OD机试-考勤信息-双指针(JAVA 2025B卷)
  • 第五章:执行计划分析 - 读懂MySQL的执行策略
  • Nginx 配置中·IP地址变量
  • leetcode148-排序链表
  • SimpleQtLogger 使用总结
  • Nginx全面深入学习目录
  • 我的JavaWeb软件开发作品学生信息管理系统项目/JavaWeb软件开发 课程考察标准
  • OmniMeetProTrack 全维会议链智能追录系统——山东大学软件学院创新实训项目博客(六)
  • 零基础学前端-传统前端开发(第四期-JS基础-语法,语句)
  • 【SQLAlchemy系列】 SQLAlchemy 中的多条件查询:or*与 in*操作符
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之PID详解
  • java+vue+SpringBoo旅游网(程序+数据库+报告+部署教程+答辩指导)
  • Spring-ai 1.0.0 学习(二)——最小化样例
  • 网络安全相关概念与技术详解
  • C++ 网络编程(12)利用单例逻辑实现逻辑类
  • Arthas 全面学习指南
  • 如何用AI绘画工具创作出属于你的拉布布(泡泡玛特)形象?
  • K-Means算法详细解析:从原理到实践
  • 618背后的电商逻辑重构:从价格血战到价值共生
  • Level1.8for循环
  • 3.TCP回响服务器实现及源码分析上
  • 基于Webserver的数据采集
  • Java中hashCode方法与equal方法何时重写
  • 1、Java基础语法通关:从变量盒子到运算符魔法
  • Qt如何生成和使用DLL动态链接库
  • CountDownLatch、CyclicBarrier与Semaphore 核心技术解析