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

【C/C++】algorithm清单以及适用场景

文章目录

  • algorithm清单以及适用场景
    • 1 算法介绍
      • 1.1 分类
      • 1.2 非修改序列算法
      • 1.3 修改序列算法
      • 1.4 排序与堆算法
      • 1.5 集合操作算法(要求有序)
      • 1.5 查找算法
      • 1.6 二分查找算法(有序区间)
      • 1.7 去重与分区算法
      • 1.8 数值算法 `<numeric>`
    • 2 适用场景
      • 2.1 遍历与条件检查
      • 2.2 修改容器内容(非排序)
      • 2.3 排序、分区与堆处理
      • 2.4 二分查找(有序容器)
      • 2.5 集合操作(有序容器)
      • 2.6 去重、分组与映射
      • 2.7 数值运算 `<numeric>`
    • 总结:使用 STL 算法的优势

algorithm清单以及适用场景

C++ 标准库 <algorithm>STL 算法函数主要作用于迭代器区间 [first, last),并对容器元素进行操作。


1 算法介绍

1.1 分类

  • 非修改序列算法
  • 修改序列算法
  • 排序与堆算法
  • 集合操作算法
  • 查找算法
  • 二分查找算法
  • 去重与分区算法
  • 数值算法 <numeric>

1.2 非修改序列算法

函数说明
for_each对每个元素应用函数
count / count_if统计等于/满足条件的元素个数
find / find_if / find_if_not查找元素
mismatch找出第一个不匹配的元素对
equal判断两个区间是否相等
all_of / any_of / none_of判断所有/任一/无元素满足条件

1.3 修改序列算法

函数说明
copy / copy_if拷贝元素
move移动元素
fill / fill_n用指定值填充区间
transform应用函数于每个元素
replace / replace_if / replace_copy替换元素
remove / remove_if / remove_copy删除元素(惰性)
unique / unique_copy删除连续重复元素
reverse / reverse_copy反转区间
rotate / rotate_copy旋转元素
shuffle随机打乱
swap_ranges交换两个区间元素
partition / stable_partition分区(按条件拆分)

1.4 排序与堆算法

函数说明
sort / stable_sort快速排序 / 稳定排序
partial_sort / partial_sort_copy局部排序
nth_element找第 n 小的元素,部分排序
is_sorted / is_sorted_until判断是否已排序
make_heap / push_heap / pop_heap / sort_heap堆算法
is_heap / is_heap_until是否为堆

1.5 集合操作算法(要求有序)

函数说明
merge合并两个有序区间
includes是否包含另一区间
set_union并集
set_intersection交集
set_difference差集
set_symmetric_difference对称差集

1.5 查找算法

函数说明
find / find_if / find_if_not基础查找
search / search_n区间搜索(子序列)
adjacent_find找相邻相等元素
max_element / min_element找最大/最小值
lexicographical_compare字典序比较
clamp限制值在范围内

1.6 二分查找算法(有序区间)

函数说明
binary_search判断是否存在元素
lower_bound第一个 ≥ value 的位置
upper_bound第一个 > value 的位置
equal_range返回 [lower_bound, upper_bound)

1.7 去重与分区算法

函数说明
unique删除连续重复值
partition按条件划分元素
stable_partition稳定版本分区

1.8 数值算法 <numeric>

虽然不在 <algorithm> 中,但常配套使用:

函数说明
accumulate求和(或自定义函数)
inner_product内积
partial_sum前缀和
adjacent_difference相邻差值

2 适用场景

<algorithm> 中的 STL 算法涵盖了绝大多数常见的数据处理操作 —— 排序、查找、修改、合并、去重等。


2.1 遍历与条件检查

  • 遍历元素并做处理
  • 检查是否满足某个条件
  • 查找满足某条件的元素
函数典型用途
for_each批量操作,例如打印元素
all_of / any_of / none_of验证所有/部分元素是否满足条件
find, find_if查找指定元素或满足条件的第一个元素
count, count_if统计元素个数(或满足条件)

2.2 修改容器内容(非排序)

  • 替换、删除、移动或复制元素
  • 批量处理内容生成新容器
函数典型用途
copy, copy_if拷贝部分元素到另一个容器
replace, replace_if替换满足条件的元素
remove, remove_if删除元素(注意配合 erase 使用)
transform元素映射(如 map + lambda
fill, generate用指定值或函数填充容器

2.3 排序、分区与堆处理

  • 排序列表或结构体
  • 快速找中位数或前 K 大元素
  • 使用堆进行优先队列处理
函数典型用途
sort, stable_sort排序,结构体时配合 lambda
nth_element找第 K 大(或小)元素(O(n))
is_sorted判断是否已排序
partition, stable_partition分离满足条件的元素
make_heap, pop_heap优先队列模拟,堆结构处理

2.4 二分查找(有序容器)

  • 有序数组查找元素或插入位置
  • 实现 lower_bound 行为
函数典型用途
lower_bound第一个 ≥ value 的位置
upper_bound第一个 > value 的位置
equal_range返回一对边界迭代器
binary_search判断元素是否存在

特别适合:std::vectorstd::array 上使用,要求 已排序


2.5 集合操作(有序容器)

  • 处理交集、并集、差集等集合操作(如考试合格名单、权限集合等)
函数典型用途
set_union, set_intersection合并或找交集
set_differenceA 中不在 B 中的元素
includes判断是否完全包含

📌 这些都要求参与操作的容器是有序的


2.6 去重、分组与映射

  • 去除重复数据
  • 将数据按条件拆分分组
函数典型用途
unique移除连续重复元素
adjacent_find查找相邻重复元素
group_by(C++23)分组逻辑(新特性)

2.7 数值运算 <numeric>

  • 前缀和、内积、差分等数学处理
函数典型用途
accumulate累加求和
partial_sum构建前缀和数组
inner_product点积计算
adjacent_difference构建差分数组

总结:使用 STL 算法的优势

优点说明
✅ 简洁大多数操作 1 行搞定
✅ 高效内部优化 + 编译器识别
✅ 安全避免手写循环时的越界、逻辑错误
✅ 可读性好和业务逻辑贴近,便于维护

相关文章:

【C/C++】algorithm清单以及适用场景

文章目录 algorithm清单以及适用场景1 算法介绍1.1 分类1.2 非修改序列算法1.3 修改序列算法1.4 排序与堆算法1.5 集合操作算法&#xff08;要求有序&#xff09;1.5 查找算法1.6 二分查找算法&#xff08;有序区间&#xff09;1.7 去重与分区算法1.8 数值算法 <numeric>…...

Python_day47

作业&#xff1a;对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层&#xff08;如第 1 - 3 层&#xff09;边缘、纹理、颜色、简单形状等基础特征低高&#xff0c;直接与输入像素关联中层卷积层&#xff08…...

如何在mac上安装podman

安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman&#xff1a; (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…...

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo

引言 小黑黑通过探索langchain源码&#xff0c;设计了一个关于agent使用工具的一个简化版小demo&#xff08;代码可以跑通&#xff09;&#xff0c;主要流程&#xff1a; 1.问题输入给大模型。 2.大模型进行思考&#xff0c;输出需要执行的action和相关思考信息。 3.通过代理&…...

CppCon 2015 学习:Intro to the C++ Object Model

这段代码展示了使用 make 工具来编译 C 程序的简单过程。 代码和步骤解析&#xff1a; C 代码&#xff08;intro.cpp&#xff09;&#xff1a;#include <iostream> int main() { std::cout<<"hello world\n"; } 这是一个简单的 C 程序&#xff0c;它包…...

Go 语言中的 make 函数详解

Go 语言中的 make 函数详解 make 是 Go 语言中的一个​​内置函数​​&#xff0c;用于​​初始化切片&#xff08;slice&#xff09;、映射&#xff08;map&#xff09;和通道&#xff08;channel&#xff09;​​这些引用类型。这些类型必须在使用前通过 make 初始化&#x…...

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…...

用 NGINX 构建高效 SMTP 代理`ngx_mail_smtp_module`

一、模块定位与作用 协议代理 NGINX 监听指定端口&#xff08;如 25、587、465 等&#xff09;&#xff0c;接收客户端的 SMTP 会话请求。代理层在会话中透明转发客户端的 EHLO、MAIL FROM、RCPT TO、DATA 等命令到后端 MTA。 认证控制 通过 smtp_auth 指令指定允许的 SASL 认…...

【前端】常用组件的CSS

1. button的样式修改 每个环节有五个不同的状态:link,hover,active,focus和visited. Link是正常的外观,hover当你鼠标悬停时,active是单击它时的状态,focus跟随活动状态,visited是你在最近点击的链接未聚焦时结束的状态。 纯CSS 以下为例子&#xff0c;按下后从浅紫到深紫。注…...

【华为云学习与认证】以华为云物联网为基座的全栈开发(从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等)的系统性学习与认证路线

总目标 学习以华为云物联网为基座的全栈开发&#xff08;从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等&#xff09;的系统性学习与认证路线。计划包含阶段学习、技术文档、实操实际操作、开发路径与考证规划&#xff0c;提供职业生涯基础性规划。 注意&…...

OpenCV 键盘响应来切换图像

一、知识点 1、int waitKey(int delay 0); (1)、等待按键。 等待指定的毫秒数&#xff0c;返回按键的ASCII码。 (2)、返回值: int型&#xff0c;表示按键ASCII码。 若没有按键&#xff0c;指定时间过去&#xff0c;返回-1。 (3)、参数delay: 等待时间&#xff0c;单位毫…...

ARM SMMUv3简介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系统内存管理单元&#xff09;是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似&#xff0c;都是将虚拟地址转换成物理地址&#xff0c;不同的是MMU转换的虚拟地址来自CPU&#xff0c;S…...

C#提取CAN ASC文件时间戳:实现与性能优化

C#提取CAN ASC文件时间戳&#xff1a;实现与性能优化 在汽车电子和工业控制领域&#xff0c;CAN总线是最常用的通信协议之一。而ASC&#xff08;ASCII&#xff09;文件作为CAN总线数据的标准日志格式&#xff0c;广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…...

hadoop集群datanode启动显示init failed,不能解析hostname

三个datanode集群&#xff0c;有一个总是起不起来。去查看log显示 Initialization failed for Block pool BP-1920852191-192.168.115.154-1749093939738 (Datanode Uuid 89d9df36-1c01-4f22-9905-517fee205a8e) service to node154/192.168.115.154:8020 Datanode denied com…...

Android 视图系统入门指南

1. View&#xff1a;界面的最小单位 本质&#xff1a;屏幕上的一个矩形区域&#xff0c;能显示内容或接收触摸。比喻&#xff1a;就像乐高积木&#xff0c;是组成界面的最小单位。常见子类&#xff1a; TextView&#xff08;文字积木&#xff09;、Button&#xff08;按钮积木…...

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可…...

青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统

青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统 一、历史背景二、核心架构三、关键功能四、管理工具五、客户端支持六、版本演变七、衰落原因八、遗产与影响总结 摘要&#xff1a;NetWare 是早期网络操作系统的巅峰之作&#xff0c;其高性能文件服务、目录管理和容错…...

AI编程提示词

你是 IDE 的 AI 编程助手&#xff0c;遵循核心工作流&#xff08;研究 -> 构思 -> 计划 -> 执行 -> 评审&#xff09;用中文协助用户&#xff0c;面向专业程序员&#xff0c;交互应简洁专业&#xff0c;避免不必要解释。[沟通守则] 1. 响应以模式标签 [模式&#…...

Android学习总结-GetX库常见问题和解决方案

GetX库的常见问题 ​路由管理&#xff1a;Get.to() 后页面不跳转或卡顿&#xff1f;​​ ​问题&#xff1a;​​ 明明调用了 Get.to(NextPage())&#xff0c;但页面没反应&#xff0c;或者感觉有延迟卡顿。这可能发生在较复杂的页面树或低端设备上。​原因&#xff1a;​​ ​…...

|从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面

&#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411;♈前言♈♈调取Deepseek大模型♈♒准备工作♒♒调用API♒ ♈将模型嵌入到ui界面中♈♈…...

React 中 HTML 插入的全场景实践与安全指南

在 React 开发过程中&#xff0c;我们常常会遇到需要插入 HTML 内容的场景。比如将服务端返回的富文本渲染到页面&#xff0c;还有处理复杂的 UI 结构&#xff0c;正确的 HTML 插入方式不仅影响页面展示效果&#xff0c;更关乎应用的安全性。 本文将详细探讨 React 中插入 HTM…...

一键更新依赖全指南:Flutter、Node.js、Kotlin、Java、Go、Python 等主流语言全覆盖

在现代软件开发中&#xff0c;依赖项扮演着至关重要的角色。保持依赖的最新状态不仅可以获得新特性和性能优化&#xff0c;还能修复已知安全漏洞。但在不同语言和框架中&#xff0c;依赖管理的方式差异很大。本篇文章将系统性讲解如何在各主流语言中实现“一键更新依赖”。 &am…...

Java异步编程难题拆解技术

异步编程基础与核心概念 异步编程模型与同步模型的对比 Java中异步编程的常见场景&#xff08;IO密集型、高并发任务等&#xff09; 关键术语&#xff1a;Future、CompletableFuture、回调、事件循环 Java异步编程的核心API与框架 Future接口的局限性及基本用法 Completable…...

NoSQL 之 Redis 配置与优化

目录 一、 前置知识点 1. 关系数据库与非关系型数据库 &#xff08;1&#xff09;关系型数据库 &#xff08;2&#xff09;非关系型数据库 &#xff08;3&#xff09;非关系型数据库产生背景 &#xff08;4&#xff09;两者对比 2. Redis 基础 &#xff08;1&#xff0…...

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…...

产品笔试专业名词梳理

目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的&#xff1a; SWOT分析的优点&#xff1a; SWOT分析的局限与注意事项&…...

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…...

51单片机基础部分——矩阵按键检测

前言 上一节&#xff0c;我们说到了独立按键的检测以及使用&#xff0c;但是独立按键每一个按键都要对应一个IO口进行检测&#xff0c;在一些需要多按键的情况下&#xff0c;使用过多的独立按键会过多的占用单片机的IO资源&#xff0c;为了解决这个问题的出现&#xff0c;我们…...

onSaveInstanceState() 和 ViewModel 在数据保存能力差异

一、设计目标差异 ​​维度​​onSaveInstanceState()ViewModel​​核心目的​​保存 ​​瞬态 UI 状态​​&#xff08;如用户输入、滚动位置&#xff09;&#xff0c;应对进程意外终止或配置变更。管理 ​​业务逻辑相关数据​​&#xff0c;在配置变更时保留数据&#xff0…...

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…...