<C++学习>C++ std::algorithm 教程

news2025/1/12 6:19:47

C++ 标准模板库(STL)中的 <algorithm> 提供了丰富的算法集合,涵盖了排序、查找、修改、比较等常见操作。它们与 C++ 容器紧密结合,能够高效地处理容器中的数据。

1. std::algorithm 的特点

  1. 通用性:基于迭代器设计,适用于各种容器(如 std::vectorstd::list)。
  2. 高效性:大多数算法都经过优化,可以直接用于生产环境。
  3. 灵活性:许多算法可以通过传递函数对象或 lambda 表达式自定义行为。

2. 常用算法概览

2.1 分类

  1. 修改容器内容

    • 排序:std::sortstd::stable_sort
    • 逆序:std::reverse
    • 删除:std::removestd::remove_if
    • 替换:std::replacestd::replace_if
  2. 查找元素

    • 普通查找:std::findstd::find_if
    • 二分查找:std::binary_search
  3. 数值算法

    • 累加:std::accumulate
    • 部分和:std::partial_sum
  4. 比较与检查

    • 全部满足:std::all_of
    • 任意满足:std::any_of
    • 无一满足:std::none_of

3. 算法应用详解

3.1 排序算法

1. std::sort

std::sort 用于对范围内的元素进行快速排序(默认升序)。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    // 升序排序
    std::sort(vec.begin(), vec.end());

    // 自定义排序:降序
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a > b;
    });

    for (int val : vec) {
        std::cout << val << " ";
    }
    return 0;
}

2. std::stable_sort

保证排序稳定性(即保持相同元素的原有顺序)。

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

3. std::reverse

将容器中的元素逆序。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

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

    for (int val : vec) {
        std::cout << val << " ";
    }
    return 0;
}

3.2 查找算法

1. std::find

从范围 [first, last) 中找到第一个匹配的元素。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 20, 30, 40};

    auto it = std::find(vec.begin(), vec.end(), 30);
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not found!" << std::endl;
    }
    return 0;
}

2. std::find_ifstd::find_if_not

查找满足特定条件的第一个元素。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 25, 30, 40};

    auto it = std::find_if(vec.begin(), vec.end(), [](int x) {
        return x > 20;  // 查找第一个大于 20 的元素
    });

    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    }
    return 0;
}

3. std::binary_search

在有序范围内进行二分查找,返回 truefalse

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    bool found = std::binary_search(vec.begin(), vec.end(), 30);

    std::cout << (found ? "Found" : "Not found") << std::endl;
    return 0;
}

3.3 修改算法

1. std::removestd::remove_if

逻辑删除指定的元素(实际未修改容器大小,需要配合 erase)。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 2, 6};

    // 删除所有值为 2 的元素
    vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());

    for (int val : vec) {
        std::cout << val << " ";
    }
    return 0;
}

2. std::replacestd::replace_if

将容器中所有匹配的元素替换为新值。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 2, 4, 5};

    std::replace(vec.begin(), vec.end(), 2, 99);  // 把所有 2 替换为 99

    for (int val : vec) {
        std::cout << val << " ";
    }
    return 0;
}

3.4 数值算法

1. std::accumulate

对范围内的元素求和或进行累积操作(需要引入 <numeric>)。

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    int sum = std::accumulate(vec.begin(), vec.end(), 0);
    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

2. std::partial_sum

计算部分和。

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};
    std::vector<int> result(vec.size());

    std::partial_sum(vec.begin(), vec.end(), result.begin());

    for (int val : result) {
        std::cout << val << " ";  // 输出: 1 3 6 10
    }
    return 0;
}

3.5 条件算法

1. std::all_of, std::any_of, std::none_of

检查容器中是否有元素满足条件。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    bool allPositive = std::all_of(vec.begin(), vec.end(), [](int x) { return x > 0; });
    bool hasEven = std::any_of(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });
    bool noNegative = std::none_of(vec.begin(), vec.end(), [](int x) { return x < 0; });

    std::cout << "All positive: " << allPositive << std::endl;
    std::cout << "Has even: " << hasEven << std::endl;
    std::cout << "No negative: " << noNegative << std::endl;

    return 0;
}

4. 学习建议与实践

学习重点

  1. 熟悉算法的通用接口:迭代器范围 [first, last)
  2. 掌握常用算法(如 std::sortstd::findstd::accumulate)。
  3. 理解如何通过 lambda 表达式自定义算法行为。

练习题

  1. 使用 std::sortstd::reverse 对数组进行升序和降序排序。
  2. 使用 std::find 在容器中查找特定值。
  3. 使用 std::accumulate 计算数组元素的累积乘积。
  4. 使用 std::all_of 判断数组是否为正数。

通过以上算法的学习和实践,你将能灵活使用 C++ STL 算法处理复杂的数据操作!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hutool糊涂工具通过注解设置excel宽度

import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public interface ExcelStyle {int width() default 0; }/*** 聊天记录*/ Data public class DialogContentInfo {/**…

全面教程:Nacos 2.4.2 启用鉴权与 MySQL 数据存储配置

全面教程&#xff1a;Nacos 2.4.2 启用鉴权与 MySQL 数据存储配置 1. 配置 Nacos 开启鉴权功能 1.1 修改 application.properties 配置文件 在 Nacos 2.4.2 中&#xff0c;开启鉴权功能需要修改 conf/application.properties 文件。按照以下方式配置&#xff1a; # 开启鉴权…

【学习】CMMM智能制造能力成熟度评估的重要性

CMMM认证通过对企业当前生产状态的全面评估&#xff0c;能够精准地确定其智能化生产的程度&#xff0c;并将企业的智能化生产水平划分为五个等级&#xff0c;包括初始级、已定义级、以管理级、卓越级和顶级。这种等级划分使得不同类型的企业能够根据自身实际情况&#xff0c;选…

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

Y3编辑器地图教程:ORPG教程、防守图教程

文章目录 Part1&#xff1a;ORPG教程一、章节人物选择1.1 Logo与界面动画1.2 章节选择与投票1.2.1 设计章节选择完毕后的操作1.2.2 玩家投票统计 1.3 多样化的人物选择系统1.3.1 异步模型显示1.3.2 双击和键盘选人1.3.3 UI选人 1.4 简易存档 二、对话与任务系统2.1对话UI与触发…

Ubuntu问题 -- 硬盘存储不够了, 如何挂载一个新的硬盘上去, 图文简单明了, 已操作成功

需求 我现在有一个ubuntu22.04操作系统的服务器, 但是当前硬盘不够用了, 我买了一个1T的SSD固态硬盘, 且已经安装在服务器上了, 我需要将这个硬盘挂载到当前ubuntu的某个目录上 开始 1. 确认新硬盘是否被系统识别 打开终端&#xff0c;输入以下命令查看系统识别到的硬盘&…

吴恩达 提示词工程 课程笔记

一、Introduction 二、Guidelines Principle1: 清晰&#xff08;不一定是简短的&#xff09;而具体的指令 Tactic1: 使用分隔符 Triple quotes: “”" Triple backticks: Triple dashes: — Angle brackets:< > XML tags: < tag></ tag> Tactic2:…

网络安全设备主要有什么

网络安全设备指的肯定是硬件设备了&#xff0c;国内卖安全硬件的没几家&#xff0c;天融信&#xff0c;启明星辰&#xff0c;绿盟&#xff0c;深信服&#xff0c;就这四家卖的比较齐全吧&#xff0c;上它们官网看一下&#xff0c;就知道市面上主要的网络安全设备有哪些了。分类…

【C++补充】第一弹---位图技术揭秘:内存优化与快速访问

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 位图 1.1 位图相关面试题 1.2 位图的设计及实现 1.3 C库中的位图 bitset 1.4 位图的模拟实现 1.5 位图的优缺点 1.6 位图相关考察题目 1 …

解决nginx多层代理后应用部署后访问发现css、js、图片等样式加载失败

一般是采用前后端分离部署方式&#xff0c;被上一层ng代理后&#xff0c;通过域名访问报错&#xff0c;例如&#xff1a;sqx.com.cn/应用代理路径。 修改nginx配置&#xff0c;配置前端页面的路径&#xff1a; location / {proxy_pass http://前端页面所在服务器的IP:PORT;pro…

第34天:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法

时间轴&#xff1a; Java反射相关类图解&#xff1a; 反射&#xff1a; 1、什么是 Java 反射 参考&#xff1a; https://xz.aliyun.com/t/9117 Java 提供了一套反射 API &#xff0c;该 API 由 Class 类与 java.lang.reflect 类库组成。 该类库包含了 Field 、 Me…

Qt天气预报系统获取天气数据

Qt天气预报系统获取天气数据 1、获取天气数据1.1添加天气类头文件1.2定义今天和未来几天天气数据类1.3定义一个解析JSON数据的函数1.4在mainwindow中添加weatherData.h1.5创建今天天气数据和未来几天天气数据对象1.6添加parseJson定义1.7把解析JSON数据添加进去1.8添加错误1.9解…

SQL SERVER 2016 创建用户。

一、在实例中创建用户 二、在数据库中创建用户分配表格权限. 三、也可以在表格属性中分配用户权限 四、搜索对象中可以选择表、视图等等内容.

汽车信息安全 -- S32K1如何更新BOOT_MAC

目录 1.安全启动模式回顾 2.为什么要讨论BOOT_MAC 3.S32K1如何更新? 1.安全启动模式回顾 之前提到过,S32K1系列提供了Crypto Service Engine硬件加密模块(简称CSEc),大家可以通过该芯片系统寄存器SDID.FEATURES(System Device Identification Register)来判断自己的片子…

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…

智慧城市应急指挥中心系统平台建设方案

建设背景与目标 智慧城市应急指挥中心系统平台的建设&#xff0c;源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源&#xff0c;实现应急事件的快速响应与高效处置&#xff0c;提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…

Playwright实战:Locators(定位器)指南

Locators Locators是Playwright自动等待和重试能力的核心部分。简而言之&#xff0c;Locators代表了一种随时在页面上查找元素的方法。 快速指南 这些是推荐的内置定位器。 page.getbyrole()通过显式和隐式可访问性属性进行定位。page.get_by_text()用于按文本内容定位。pa…

HTTP 核心概念

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

centos7.6 安装nginx 1.21.3与配置ssl

1 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2 下载Nginx wget http://nginx.org/download/nginx-1.21.3.tar.gz3 安装目录 mkdir -p /data/apps/nginx4 安装 4.1 创建用户 创建用户nginx使用的nginx用户。 #添加www组 # groupa…

Homestyler 和 Tripo AI 如何利用人工智能驱动的 3D 建模改变定制室内设计

让设计梦想照进现实 在Homestyler,我们致力于为每一个梦想设计师提供灵感的源泉,而非挫折。无论是初学者打造第一套公寓,或是专业设计师展示作品集,我们的直观工具都能让您轻松以惊人的3D形式呈现空间。 挑战:实现定制设计的新纪元 我们知道,将个人物品如传家宝椅子、…