C++如何使用std::algorithm库中的常用算法?(示例讲解)

std::algorithm库通过迭代器操作元素区间,核心是迭代器范围和谓词;基础算法如for_each、find/find_if、count/count_if用于遍历、查找、计数;sort等修改算法要求随机访问迭代器。

c++如何使用std::algorithm库中的常用算法?(示例讲解)

std::algorithm 库提供了大量通用、高效的算法,它们不直接操作容器,而是通过迭代器作用于元素区间。用好它需要理解“迭代器范围”和“谓词”两个核心概念。

基础操作:遍历、查找、计数

这些算法接受一对迭代器([first, last) 左闭右开区间),适用于所有支持相应迭代器的容器(vector、list、array、string 等)。

std::for_each:对区间内每个元素执行函数。适合无返回值的操作,比如打印或累加:vector v = {1, 2, 3, 4, 5};
int sum = 0;
for_each(v.begin(), v.end(), [&sum](int x) { sum += x; }); // sum = 15std::find / std::find_if:前者按值查找,后者按条件查找,返回首个匹配的迭代器(未找到则返回 end):auto it = find(v.begin(), v.end(), 3); // 找到值为3的元素
auto even_it = find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; }); // 找第一个偶数std::count / std::count_if:统计满足条件的元素个数:int cnt = count(v.begin(), v.end(), 2); // cnt = 1
int even_cnt = count_if(v.begin(), v.end(), [](int x) { return x > 2; }); // cnt = 3

修改序列:排序、去重、重排

注意:这些算法通常不改变容器大小,但会重排或修改元素值;部分要求随机访问迭代器(如 vector、array),不能用于 list(需用 list::sort 等成员函数)。

std::sort:默认升序,可传入自定义比较函数(支持 lambda、函数对象、函数指针):sort(v.begin(), v.end()); // 升序
sort(v.begin(), v.end(), greater()); // 降序
sort(v.begin(), v.end(), [](int a, int b) { return abs(a) std::unique + erase(惯用法):std::unique 只把重复元素移到末尾并返回新逻辑结尾,必须配合 erase 才真正删除:vector w = {1, 2, 2, 3, 3, 3, 4};
auto new_end = unique(w.begin(), w.end()); // w 变为 {1,2,3,4,3,3,4},new_end 指向第5个元素
w.erase(new_end, w.end()); // 真正删掉重复项 → {1,2,3,4}std::reverse / std::rotate:反转区间;rotate 将区间循环左移(以某点为分界):reverse(v.begin(), v.end()); // {5,4,3,2,1}
rotate(v.begin(), v.begin() + 2, v.end()); // 从第2个位置起左旋 → {3,4,5,1,2}

数值计算:累积、极值、相邻操作

这些算法位于 头文件中,常与 algorithm 配合使用。

立即学习“C++免费学习笔记(深入)”;

std::accumulate:求和、连接字符串、自定义折叠操作(需提供初始值和二元操作):int total = accumulate(v.begin(), v.end(), 0); // 0 是初值
string s = accumulate(words.begin(), words.end(), string(“”), [](string a, string b) { return a + “-” + b; });std::max_element / std::min_element:返回最大/最小元素的迭代器(不是值),支持自定义比较:auto max_it = max_element(v.begin(), v.end());
if (max_it != v.end()) cout std::adjacent_difference / std::partial_sum:生成相邻差值序列或前缀和序列(输出到另一容器或原地):vector diffs(v.size());
adjacent_difference(v.begin(), v.end(), diffs.begin()); // diffs[0]=v[0], diffs[i]=v[i]-v[i-1]

实用提醒

算法本身不负责内存管理,也不检查越界——传入合法迭代器是调用者的责任;lambda 捕获要谨慎(避免悬垂引用);多数算法时间复杂度明确(如 sort 平均 O(n log n),find 是 O(n));对已排序区间,优先考虑 lower_bound / upper_bound / binary_search 等对数复杂度算法。

基本上就这些。掌握好迭代器范围、谓词写法和常见组合(比如 unique+erase),就能覆盖日常 90% 的数据处理需求。

以上就是C++如何使用std::algorithm库中的常用算法?(示例讲解)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++如何实现一个无锁队列?C++高并发数据结构实战【性能调优】
上一篇 2025年12月19日 12:00:26
c++中的ABI兼容性问题是什么_c++库版本管理与二进制接口【详解】
下一篇 2025年12月19日 12:00:34

相关推荐

  • 查看Office 2019密钥记录_Office 2019密钥输入常见错误

    首先查找并正确输入25位产品密钥,若提示已使用,则登录Microsoft帐户直接安装。 如果您在尝试激活 Office 2019 时遇到问题,可能是由于产品密钥输入错误或密钥状态异常导致的。以下是查找正确密钥以及解决常见输入错误的详细步骤: 一、查找已购买的Office 2019产品密钥 当您需要重…

    2026年8月27日
    000
  • 协程调度(Scheduler)与上下文切换

    协程调度决定何时运行哪个协程,上下文切换则在调度过程中保存和恢复协程状态。1. 协程调度通过策略如优先级或轮转决定执行顺序,提高程序效率。2. 上下文切换通过关键字如yield或await实现,但频繁切换会增加性能开销。 协程调度与上下文切换是个既迷人又复杂的话题,让我们深入探讨一番。 在编程世界中…

    2026年8月27日
    000
  • 如何优雅地管理PHP异步操作:使用Composer引入GuzzleHttp/Promises

    Composer在线学习地址:学习地址 告别“回调地狱”:PHP异步操作的痛点 你是否曾遇到这样的场景:你的php应用需要从多个外部服务获取数据,或者执行一些耗时的后台任务。如果这些操作都是同步进行的,那么用户就得眼睁睁地看着页面转圈,直到所有操作完成。这不仅严重影响了用户体验,也浪费了服务器资源。…

    用户投稿 2026年8月27日
    000
  • 录音笔传输文件自动校验

    录音笔传输文件自动校验录音笔传输文件自动校验录音笔传输文件自动校验录音笔传输文件自动校验

    一、引言 校验文件完整性的重要性:在日常工作和生活中,我们常常需要从网络上获取各种数据,但这些下载的文件是否安全值得商榷;即使是安全的,如果下载不完整,也会导致文件不可用;更糟糕的是,文件可能被篡改,加入了木马、病毒或广告等。因此,下载数据时校验其完整性是非常必要的。 在小编(●—●)参与的项目中,…

    2026年8月27日 用户投稿
    000
  • 酷狗音乐官网版入口-酷狗音乐音乐人平台官网登录入口​

    酷狗音乐官网入口为www.kugou.com,进入后可登录使用网页版听歌,支持搜索、播放、建歌单等功能;音乐人可通过官网开放平台入驻,完成资料提交后上传作品并获取收益。 酷狗音乐官网版入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来酷狗音乐官网版入口以及酷狗音乐人平台官网登录入口相关信…

    2026年8月26日
    000
  • 儿童节礼物-BlueKeep漏洞POC恐怖来袭

    儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭

    0x00:简介 (BlueKeep漏洞的编号为CVE-2019-0708) 据外媒SecurityWeek报道,近百万设备存在BlueKeep高危漏洞的安全风险,并且已有黑客开始扫描寻找潜在的攻击目标。 此漏洞被描述为可蠕虫式传播(wormable),通过RDS服务传播恶意程序,类似于2017年横行…

    2026年8月26日 用户投稿
    000
  • Bing浏览器国际版大陆能用吗_Bing国际版在国内的访问与使用情况

    Bing国际版可通过https://www.bing.com访问,中国大陆用户可能被重定向至cn.bing.com,建议清除缓存或使用无痕模式并手动切换语言和地区;部分功能受限且搜索结果可能本地化,需稳定网络环境或代理工具以获得完整体验;登录Microsoft账户可同步设置,但无法访问中国大陆屏蔽的…

    2026年8月26日
    100
  • 微信公众号怎么设置_微信公众号基础设置与菜单配置教程

    答案:微信公众号设置需完善头像、名称、功能介绍等基础信息,并合理配置自定义菜单。首先完成认证后,应立即设置清晰有辨识度的头像,命名易记且体现定位的账号名称,撰写直击用户痛点的功能介绍,并配置包含感谢语和引导内容的欢迎语;接着在自定义菜单中规划最多三个一级菜单,每个下设不超过五个二级菜单,将核心功能如…

    2026年8月26日
    100
  • Windows中Loader Lock引起的死锁问题

    在程序开发中,常见的做法是将程序模块化,通常实现为动态链接库(dll)。在主程序启动时,可以通过隐式或显式的方式加载这些动态链接库。然而,在windows系统中,如果动态链接库的dllmain函数编写不当,可能会导致一些意想不到的bug,例如典型的loader lock死锁问题。这是一个许多wind…

    2026年8月26日
    000
  • 苹果怎么设浏览器默认_iPhone设置默认浏览器应用教程

    从iOS 14起可设第三方浏览器为默认。先确认Chrome、Edge等已支持并更新,再进入设置→浏览器→默认浏览器应用→选择对应浏览器,最后点击链接验证是否生效。 从iOS 14开始,苹果允许用户将第三方浏览器设为默认应用。虽然系统自带Safari仍是初始默认,但你可以轻松更换成Chrome、Edg…

    2026年8月26日
    100
  • win11系统提示管理员权限不足_win11获取最高权限的完整教程

    win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程

    要解决win11管理员权限不足的问题,可以采取以下措施:1. 以管理员身份运行程序;2. 调整uac设置降低敏感度;3. 获取受限制文件或文件夹的所有权;4. 确认当前账户为管理员类型;5. 启用隐藏的内置管理员账户临时解决问题;6. 通过注册表修改提升权限但需谨慎操作。权限问题通常源于uac机制限…

    2026年8月26日 用户投稿
    000
  • 如何利用Java使用ConcurrentHashMap处理并发

    ConcurrentHashMap因分段锁和CAS机制提升并发性能,支持原子操作如putIfAbsent、compute、merge,遍历时提供弱一致性视图,适用于高并发场景。 在多线程环境中,ConcurrentHashMap 是 Java 提供的一个高效且线程安全的 Map 实现。它比传统的 H…

    2026年8月26日
    000
  • DevOps核心原则-稳定的工作流程

    DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程

    如果您询问三个人对devops的定义,您可能会得到四种不同的回答。有时,参与运营的开发人员被称为devops。其他人认为它与基础设施和部署的自动化有关。还有一些人认为devops是系统管理员的现代化标签。显然,这个术语非常流行。那么,devops到底是什么呢? DevOps的第一种方式是通过组织中各…

    2026年8月26日 用户投稿
    100
  • 什么是java Java编程语言全面介绍

    java是一个强大的编程语言,适用于从小型应用到大型企业级系统的开发。其核心特点包括:一次编写,到处运行:通过jvm实现跨平台运行。面向对象编程:支持类、对象、继承和多态,增强代码组织和灵活性。集合框架:提供如arraylist等工具,简化数据处理。丰富的生态系统:包括异常处理、多线程、lambda…

    2026年8月26日
    000
  • ​​如何设置开机密码?Win/Mac密码保护教程​

    开机密码,顾名思义,就是一道守护你电脑的第一道防线。设置它,能有效防止未经授权的访问,保护你的个人信息和数据安全。无论是 Windows 还是 macOS,设置开机密码都非常简单,但背后的逻辑和一些小技巧,可能你还不太清楚。 设置开机密码,其实就是给自己数据加把锁。 Windows 设置开机密码 W…

    2026年8月26日
    100
  • 怎么样设置路由器_路由器基本上网与安全设置教程

    路由器设置需先连接设备并登录管理界面,选择上网方式、设置Wi-Fi密码及安全功能;定期检查性能与安全性,必要时更换或升级路由器。 路由器设置,简单来说,就是让你的路由器能够顺利连接互联网,并且保证网络安全。这包括配置上网方式、设置无线网络密码,以及开启一些安全防护功能。 路由器基本上网与安全设置教程…

    2026年8月26日
    000
  • win10怎么把输入法图标隐藏_隐藏或移除任务栏输入法图标的设置

    可通过任务栏设置、注册表编辑器或组策略编辑器隐藏Windows 10任务栏输入法图标,提升界面简洁性。 如果您在使用Windows 10时希望让任务栏看起来更简洁,可能会想要隐藏输入法图标。该图标通常显示在任务栏右下角,占用视觉空间且在多语言输入环境下可能频繁切换。以下是实现隐藏或移除任务栏输入法图…

    2026年8月26日
    000
  • 微信公众号字体怎么改_微信公众号文章字体样式修改教程

    微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程

    答案是微信公众号不支持自定义字体上传,但可通过字号、颜色、加粗、段落样式及第三方工具等现有功能,结合品牌化排版策略,在统一规范下提升文章视觉风格与阅读体验。 微信公众号文章的字体样式修改,说实话,并没有一个直接的“选择字体”菜单让你像Word那样随意切换成宋体、黑体或者其他个性化字体。它的核心在于通…

    2026年8月26日 用户投稿
    300
  • 微信公众号报名怎么做_微信公众号活动报名功能设置教程

    微信公众号报名怎么做_微信公众号活动报名功能设置教程微信公众号报名怎么做_微信公众号活动报名功能设置教程微信公众号报名怎么做_微信公众号活动报名功能设置教程微信公众号报名怎么做_微信公众号活动报名功能设置教程

    答案:微信公众号活动报名主要通过第三方工具或自主开发实现。推荐使用“活动行”“金数据”等第三方平台,操作简便、成本低,适合大多数运营者;若有定制化需求且具备技术能力,可基于微信开发接口自行搭建。选择工具时需考量功能匹配度、易用性、成本、数据安全及品牌定制能力。设计表单应精简字段、优化移动端体验、增强…

    2026年8月26日 用户投稿
    000
  • 谷歌浏览器官方入口网页登录 谷歌登录入口在线地址

    谷歌浏览器官方登录入口是https://www.google.com,页面简洁直观,布局清晰,以白色背景和谷歌标志性四色搭配,功能区划分明确,适配多设备,提供强大搜索与广泛生态服务。 谷歌浏览器官方入口网页登录地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌登录入口在线地址,感兴趣…

    2026年8月26日
    000

发表回复

登录后才能评论
关注微信