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

c++:算法(Algorithms)

目录

常用 STL 算法 

1️⃣ std::sort(排序)

2️⃣ std::find(查找等于某值的元素)

3️⃣ std::count(统计出现次数)

4️⃣ std::next(获取迭代器的下一个位置) 

 5️⃣ .erase()(容器中物理删除)

 6️⃣ std::remove(逻辑删除某值)

7️⃣ std::unique(去除连续重复元素) 

8️⃣ std::accumulate(累加求和)

9️⃣ std::unique + erase(去重)

🔟 std::remove + erase(删除指定元素)

1️⃣1️⃣ std::lower_bound / upper_bound(二分查找位置)

1️⃣2️⃣ std::for_each(遍历元素)

1️⃣3️⃣ std::reverse(翻转)

1️⃣4️⃣ std::copy(拷贝)

1️⃣5️⃣ std::prev(获取迭代器的上一个位置)

一般使用的算法 

🛠️ 使用STL算法的技巧与注意事项


C++ STL(标准模板库)中的算法是 STL 的三大核心组成之一,另外两个是 容器迭代器。STL 提供了大量的泛型算法,这些算法不依赖于特定容器,而是通过迭代器操作容器中的元素。这一设计体现了 STL 的高度抽象性和复用性。

常用 STL 算法 

1️⃣ std::sort(排序)

对支持随机访问的容器排序(如 vector, array)。

std::sort(vec.begin(), vec.end()); // 默认升序
std::sort(vec.begin(), vec.end(), std::greater<int>()); // 降序

2️⃣ std::find(查找等于某值的元素)

顺序查找容器中是否包含某个元素,返回迭代器指向第一个等于目标值的位置,找不到则返回 end()

auto it = std::find(vec.begin(), vec.end(), 10);
if (it != vec.end()) std::cout << "Found!";

3️⃣ std::count(统计出现次数)

统计某个值在容器中出现的次数。

int cnt = std::count(vec.begin(), vec.end(), 5);

4️⃣ std::next(获取迭代器的下一个位置) 

适用于任意迭代器类型(包括 list 的 bidirectional_iterator) ,比直接 + 更通用,泛型更强

auto it = std::next(vec.begin(), 3); // 相当于 vec.begin() + 3

 5️⃣ .erase()(容器中物理删除)

成员函数,真正从容器中删除元素。 

用于配合 remove, unique 等 STL 算法。 

对于 map, set 也有 .erase(key) 版本。 

vec.erase(vec.begin() + 2); // 删除第三个元素vec.erase(vec.begin() + 1, vec.begin() + 4); // 删除索引1到3的元素(左闭右开)vec.erase(std::remove(vec.begin(), vec.end(), val), vec.end()); // 删除所有val

 6️⃣ std::remove(逻辑删除某值)

并不删除元素,而是将非目标值前移。返回新末尾位置。需结合 .erase() 实现物理删除。 

auto it = std::remove(vec.begin(), vec.end(), 3); // 将值为3的元素移动到末尾
vec.erase(it, vec.end()); // 物理删除尾部冗余
  • 并不真正删除,只是将非3的元素往前挪。

  • 常与 .erase() 一起使用。

  • 时间复杂度:O(n)

7️⃣ std::unique(去除连续重复元素) 

删除连续重复元素(如 1,1,2,2 → 1,2)。若容器未排序,应先 sort。 

std::sort(vec.begin(), vec.end()); // 先排序以保证重复元素相邻
auto it = std::unique(vec.begin(), vec.end());
vec.erase(it, vec.end()); // 真正删除尾部重复数据
  • 只去除相邻的重复元素,所以通常要先 sort

  • 返回值是“新逻辑末尾”,你仍需用 .erase() 实际删除。

  • 时间复杂度:O(n)

8️⃣ std::accumulate(累加求和)

【需引入 <numeric>】 

计算从 begin()end() 的总和,支持设置初始值和自定义运算(如乘积)。 

#include <numeric>
int sum = std::accumulate(vec.begin(), vec.end(), 0); // 初始值为 0

9️⃣ std::unique + erase(去重)

仅移除连续重复元素,常配合 sort 使用。

std::sort(vec.begin(), vec.end());
auto it = std::unique(vec.begin(), vec.end());
vec.erase(it, vec.end()); // 真正删除

🔟 std::remove + erase(删除指定元素)

排序后,unique 删除重复,erase 移除多余尾部元素。  

auto it = std::remove(vec.begin(), vec.end(), 3); // 把所有3挤到后面
vec.erase(it, vec.end()); // 真正删除

1️⃣1️⃣ std::lower_bound / upper_bound(二分查找位置)

要求容器有序!常用于二分查找、查找插入位置、区间统计等。

auto lb = std::lower_bound(vec.begin(), vec.end(), 5); // 第一个 >= 5 的位置
auto ub = std::upper_bound(vec.begin(), vec.end(), 5); // 第一个 > 5 的位置

1️⃣2️⃣ std::for_each(遍历元素)

遍历并对每个元素执行操作,推荐结合 lambda 使用,使代码更简洁。 

std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";
});

1️⃣3️⃣ std::reverse(翻转)

将容器内的元素顺序完全翻转。适合回文判断、逆序操作等场景。 

std::reverse(vec.begin(), vec.end());

1️⃣4️⃣ std::copy(拷贝)

将一个区间的元素复制到另一个容器或内存区域中,目标区间必须提前分配好空间。 

std::vector<int> dest(vec.size());
std::copy(vec.begin(), vec.end(), dest.begin());

1️⃣5️⃣ std::prev(获取迭代器的上一个位置)

auto it = std::prev(vec.end());        // 指向最后一个元素
auto it2 = std::prev(vec.end(), 3);    // 向前偏移3个位置

std::prev 返回给定迭代器前面第 n 个位置的迭代器,默认 n = 1

适用于所有双向迭代器及以上,如 list, vector, set 等。

相比 --itit - 1,它是更泛型、安全的做法,适合模板代码与泛型编程。


一般使用的算法 

算法简要说明
std::find_if查找第一个满足条件的元素
std::all_of / any_of / none_of所有、任意、无元素满足条件(通常配合 lambda)
std::replace替换某个值为另一个值
std::fill填充区间为某值
std::equal比较两个区间是否相等
std::is_sorted判断是否有序
std::max_element / min_element返回最大/最小元素的迭代器
std::partition将容器按条件分区(不稳定)
std::next_permutation得到下一个字典序排列(常用于全排列)

🛠️ 使用STL算法的技巧与注意事项

  1. 熟练使用 Lambda 表达式:许多算法支持自定义的谓词(predicate),使用 lambda 表达式可以大大简化代码。

  2. 理解迭代器语义:算法通过迭代器实现泛型化。你必须理解迭代器区间是 [first, last)

  3. 与容器成员函数区别:有些容器自带 sort()(如 list),而 std::sort() 只能用于 RandomAccessIterator(如 vector)。

  4. 注意返回值的处理:很多算法返回的是迭代器,如 find, remove, partition

相关文章:

c++:算法(Algorithms)

目录 常用 STL 算法 1️⃣ std::sort&#xff08;排序&#xff09; 2️⃣ std::find&#xff08;查找等于某值的元素&#xff09; 3️⃣ std::count&#xff08;统计出现次数&#xff09; 4️⃣ std::next&#xff08;获取迭代器的下一个位置&#xff09; 5️⃣ .erase(…...

大疆无人机(全系列,包括mini)拉流至电脑,实现直播

参考视频 【保姆级教程】大疆无人机rtmp推流直播教程_哔哩哔哩_bilibili VLC使用教程&#xff1a; VLC工具使用指南-CSDN博客 目录 实现效果&#xff1a; 电脑端 ​编辑 ​编辑 无人机端 VLC拉流 分析 实现效果&#xff1a; (实验机型&#xff1a;大疆mini4kRC-N2遥控器、大…...

uniapp-商城-54-后台 新增商品(页面布局)

后台页面中还存在商品信息的添加和修改等。接下来我们逐步进行分析和展开。包含页面布局和数据库逻辑等等。 1、整体效果 样式效果如下&#xff0c;依然采用了表单形式来完成和商家信息差不多&#xff0c;但在商品属性上多做了一些弹窗等界面&#xff0c;样式和功能点表多。 …...

深入浅出MySQL 8.0:新特性与最佳实践

MySQL作为开源关系型数据库的佼佼者&#xff0c;近年来持续更新迭代&#xff0c;尤其是在8.0版本中引入了一系列令人兴奋的新特性。本文将介绍一些MySQL 8.0的关键新功能&#xff0c;并提供最佳实践&#xff0c;旨在帮助开发人员和DBA更好地利用这一强大的数据库管理系统。 一…...

JIT+Opcache如何配置才能达到性能最优

首先打开php.ini文件&#xff0c;进行配置 1、OPcache配置 ; 启用OPcache opcache.enable1; CLI环境下启用OPcache&#xff08;按需配置&#xff09; opcache.enable_cli0; 预加载脚本&#xff08;PHP 7.4&#xff0c;加速常用类&#xff09; ; opcache.preload/path/to/prel…...

(2)python开发经验

文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 pyside6加载ui文件 方法1&#xff1a; 直接加载ui文件 from PySide6.QtWidgets import QAp…...

WebpackVite总结篇与进阶

模块化 Webpack Webpack 入口entry 分离app和第三方库入口 这是什么&#xff1f; 这是告诉 webpack 我们想要配置 2 个单独的入口点&#xff08;例如上面的示例&#xff09;。 为什么&#xff1f; 这样你就可以在 vendor.js 中存入未做修改的必要 library 或文件&#xff0…...

【python】基础知识点100问

以下是Python基础语法知识的30条要点整理,涵盖数据类型、函数、控制结构等核心内容,结合最新资料归纳总结: 基础30问 一、函数特性 函数多返回值 支持用逗号分隔返回多个值,自动打包为元组,接收时可解包到多个变量 def func(): return 1, "a" x, y = func()匿…...

uniapp 百家云直播插件打包失败

打包错误日志 Android自有证书 打包失败 错误日志: https://app.liuyingyong.cn/build/errorLog/cf41a610-effe-11ef-88db-05262d4c3e5d原因&#xff1a;需要导入插件依赖 依赖地址&#xff1a;https://ext.dcloud.net.cn/plugin?id16289 百家云直播插件地址 直播插…...

SpringBoot--springboot简述及快速入门

spring Boot是spring提供的一个子项目&#xff0c;用于快速构建spring应用程序 传统方式&#xff1a; 在众多子项目中&#xff0c;spring framework项目为核心子项目&#xff0c;提供了核心的功能&#xff0c;其他的子项目都需要依赖于spring framework&#xff0c;在我们实际…...

vscode_python远程调试_pathMappings配置说明

1.使用说明 vscode python 远程调试pathMappings 配置 launch.json "pathMappings": [{"localRoot": "本地代码目录","remoteRoot": "远程代码目录" # 注意不是运行目录, 是远程代码的目录}],2.测试验证 测试目的: 远程代…...

遨游5G-A防爆手机:赋能工业通信更快、更安全

在工业数字化转型与5G-A商用进程加速的双重驱动下&#xff0c;中国防爆手机市场正迎来历史性发展机遇。作为“危、急、特”场景通信解决方案服务商&#xff0c;遨游通讯深刻洞察到&#xff1a;当5G-A网络以超高速率、海量连接和毫秒级时延重塑行业生态时&#xff0c;防爆手机这…...

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP&#xff08;XD-MDPBm20&#xff09;网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;海…...

C++八股——智能指针

文章目录 1. 背景2. 原理与使用2.1 auto_ptr2.2 unique_ptr2.3 shared_ptr2.4 weak_ptr2.5 定制删除器 1. 背景 智能指针不是指针&#xff0c;是一个管理指针的类&#xff0c;用来存储指向动态分配对象的指针&#xff0c;负责自动释放动态分配的对象&#xff0c;防止堆内存泄漏…...

「华为」人形机器人赛道投资首秀!

温馨提示&#xff1a;运营团队2025年最新原创报告&#xff08;共210页&#xff09; —— 正文&#xff1a; 近日&#xff0c;【华为】完成具身智能赛道投资首秀&#xff0c;继续加码人形机器人赛道布局。 2025年3月31日&#xff0c;具身智能机器人头部创企【千寻智能&#x…...

格雷希尔G10和G15系列自动化快速密封连接器,适用于哪些管件的密封,以及它们相关的特性有哪些?

格雷希尔G10和G15系列快速密封连接器&#xff0c;用于自动化和半自动化过程中的外部或内部密封&#xff0c;通过使用气压驱动来挤压内部的密封圈&#xff0c;创造一个适用于各种管件的无泄漏密封连接&#xff0c;连接器内部的弹性密封圈可以提供其他产品不能提供的卓越密封性能…...

mac一键安装gpt-sovit教程中,homebrew卡住不动的问题

mac一键安装gpt-sovit教程 仅作为安装过程中解决homebrew卡住问题的记录 资源地址 https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/znoph9dtetg437xb#mlAoP 下载一键包 下载后并解压&#xff0c;找到install for mac.sh&#xff0c;终端执行bash空格拖拽in…...

专栏特辑丨悬镜浅谈开源风险治理之SBOM与SCA

随着容器、微服务等新技术日新月异&#xff0c;开源软件成为业界主流形态&#xff0c;软件行业快速发展。但同时&#xff0c;软件供应链也越来越趋于复杂化和多样化&#xff0c;软件供应链安全风险不断加剧。 软件供应链安全主要包括软件开发生命周期和软件生存运营周期&#x…...

vue3项目创建-配置-elementPlus导入-路由自动导入

目录 方法一&#xff1a;create-vue 方法二 &#xff1a;Vite Vue Vite.config.ts配置 引入element-plus 安装 如何在项目中使用 Element Plus 完整引入 按需导入 vue3vite中自动配置路由的神器&#xff1a;vite-plugin-pages 1. 安装 2、修改vite.config.js中配置…...

MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置

视频讲解&#xff1a; MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核&#xff0c;脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning &#xff0c;有需要可以自行clon…...

Java大师成长计划之第20天:Spring Framework基础

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java开发领域&#xff0c;Spring …...

Innovus 25.1 版本更新:助力数字后端物理设计新飞跃

在数字后端物理设计领域&#xff0c;每一次工具的更新迭代都可能为项目带来巨大的效率提升与品质优化。今天&#xff0c;就让我们一同聚焦 Innovus 25.1 版本&#xff08;即 25.10 版本&#xff09;的更新要点&#xff0c;探寻其中蕴藏的创新能量。 一、核心功能的强势进 AI…...

FastAPI 和 MongoDB 实现请求头参数处理的示例,并在 React 中进行渲染

FastAPI 和 MongoDB 后端 安装必要的库 安装 FastAPI、Uvicorn、Motor&#xff08;用于 MongoDB 的异步驱动&#xff09;和 Pydantic&#xff08;用于数据验证&#xff09;。 pip install fastapi uvicorn motor pydantic创建 FastAPI 应用 创建一个文件 main.py&#xff0c;并…...

CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜

文章目录 一、引言二、系统架构设计2.1、整体架构概览2.2、数据库设计2.3、后端服务设计 三、实战&#xff1a;从零构建排行榜3.1、开发环境准备3.2、用户与战区 数据管理3.2.1、MySQL 数据库表创建3.2.2、实现用户和战区数据的 CURD 操作 3.3、实时分数更新3.4、排行榜查询3.5…...

码蹄集——分解、数组最大公约数、孪生质数、卡罗尔数、阶乘数

MT1158 分解 输入正整数N和M&#xff0c;判断N是否可以分解成M个不同的正整数的和&#xff0c;输出YES或者NO。 格式 输入格式&#xff1a;输入正整数N和M&#xff0c;空格分隔 输出格式&#xff1a;输出YES或者NO 样例 1 输入&#xff1a;5 2 输出&#xff1a;YES 思路…...

【React中函数组件和类组件区别】

在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...

Idea Code Templates配置

Templates配置 配置位置模板案例 配置位置 Settings->Editor->File and Code Templates模板案例 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#endimport com.ktools.common.dataprocess.DataProcess; import com.ktools…...

在线SQL转ER图工具

在线SQL转ER图网站 在数据库设计、软件开发或学术研究中&#xff0c;ER图&#xff08;实体-关系图&#xff09; 是展示数据库结构的重要工具。然而&#xff0c;手动绘制ER图不仅耗时费力&#xff0c;还容易出错。今天&#xff0c;我将为大家推荐一款非常实用的在线工具——SQL…...

python高级特性

json.dumps({a:1,n:2}) #Python 字典类型转换为 JSON 对象。相当于jsonify data2 json.loads(json_str)#将 JSON 对象转换为 Python 字典 异步编程&#xff1a;在异步编程中&#xff0c;程序可以启动一个长时间运行的任务&#xff0c;然后继续执行其他任务&#xff0c;而无需等…...

汇编:子程序设计

一、 实验要求 实验目的&#xff1a; 熟练掌握算术运算汇编指令的使用熟练掌握子程序设计的基本方法熟练掌握程序的调试方法 实验内容&#xff1a; 编程实现两个数&#xff1a;#8888H和#79H的乘除运算结合实验1的代码&#xff0c;将加减乘除四则运算写成四个子程序&#xff…...