C++ 补充之常用遍历算法

在这里插入图片描述

C++遍历算法和原理

C++标准库提供了丰富的遍历算法,涵盖了各种不同的功能。以下是一些常见的C++遍历算法以及它们的概念和原理的简要讲解:

  1. for_each:对容器中的每个元素应用指定的函数。

    • 概念:对于给定的容器和一个可调用对象,该算法将依次对容器中的每个元素调用该可调用对象。
    • 原理:通过迭代器遍历容器,对每个元素都应用给定的可调用对象。
  2. find:在容器中查找指定值第一次出现的位置。

    • 概念:给定一个容器和一个值,该算法返回指向第一个等于该值的元素的迭代器。若未找到,则返回迭代器指向容器的末尾。
    • 原理:通过线性搜索,逐个比较容器中的元素与指定的值,直到找到相等的元素。
  3. find_if:在容器中查找满足条件的第一个元素。

    • 概念:给定一个容器和一个谓词(可判断元素是否满足条件的函数或函数对象),该算法返回指向第一个满足条件的元素的迭代器。若未找到,则返回迭代器指向容器的末尾。
    • 原理:通过线性搜索,逐个对容器中的元素应用谓词,直到找到满足条件的元素。
  4. count:统计某个值在容器中出现的次数。

    • 概念:给定一个容器和一个值,该算法返回容器中与该值相等的元素的数量。
    • 原理:通过迭代器遍历容器,对每个元素与给定值进行比较并计数。
  5. sort:对容器中的元素进行排序。

    • 概念:对给定的容器中的元素进行排序,按一定的排序规则进行。
    • 原理:使用排序算法(如快速排序、归并排序等)对容器中的元素进行排序。
  6. transform:对容器中的每个元素执行某种转换。

    • 概念:给定一个容器和一个转换操作(比如函数、函数对象),该算法会对容器中的每个元素进行转换操作,并将结果存储在另一个容器中。
    • 原理:通过迭代器遍历容器,对每个元素应用给定的转换操作并将结果存储到另一容器中。
  7. copy:将容器中的元素复制到另一个容器中。

    • 概念:给定一个源容器和一个目标容器,该算法将源容器中的元素复制到目标容器中,并返回指向目标容器最后一个元素之后位置的迭代器。
    • 原理:通过迭代器遍历源容器,将每个元素复制到目标容器中。
  8. reverse:反转容器中的元素顺序。

    • 概念:给定一个容器,该算法将容器中的元素顺序进行反转。
    • 原理:通过迭代器遍历容器,使用两个迭代器指向首尾元素,依次交换它们的值,从而达到反转顺序的目的。
  9. unique:去除容器中相邻重复的元素。

    • 概念:给定一个容器,该算法移除容器中连续出现的重复元素,只保留其中一个。
    • 原理:通过迭代器遍历容器,比较相邻的元素并移除重复元素。
  10. adjacent_find:查找容器中相邻重复的元素。

    • 概念:给定一个容器,该算法返回指向第一组连续相同元素的迭代器。若未找到,则返回迭代器指向容器的末尾。
    • 原理:通过线性搜索,逐个比较容器中的相邻元素,找到第一组相同元素。

以上是一些常见的C++遍历算法的概念和原理简介。通过使用这些算法,可以方便地对容器中的元素进行各种不同的操作和处理。

今天要讲的遍历算法是:foreach,transform,find

在这里插入图片描述

C++遍历算法for_each

在C++标准库中,并没有名为foreach的遍历算法,但是可以通过使用for_each算法来达到类似的效果。for_each算法是对容器中的每个元素应用指定的函数。下面我将详细介绍for_each算法并举例说明其用法:
在这里插入图片描述

for_each算法概念:
for_each算法接受一个可调用对象(函数、函数对象或Lambda表达式)和一个范围(通常是容器),然后对范围内的每个元素都依次调用这个可调用对象。它不会改变容器中的元素,只是对每个元素进行处理。

示例代码:

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

void printSquare(int x) {
    std::cout << x * x << " ";
}

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

    // 使用for_each算法,对容器中的每个元素调用printSquare函数
    std::for_each(numbers.begin(), numbers.end(), printSquare);

    return 0;
}

示例解释:

  1. 在示例代码中,我们首先定义了一个打印平方的函数printSquare。
  2. 然后定义了一个包含数字的vector容器numbers。
  3. 在主函数中,我们使用for_each算法,对numbers容器中的每个元素都调用printSquare函数,输出每个元素的平方值。
  4. 最后程序输出结果为:1 4 9 16 25。

通过for_each算法,可以方便地对容器中的每个元素进行操作,而不需要显式地编写循环。可以根据实际需求传入不同的函数或Lambda表达式来对容器中的元素进行处理。

C++遍历算法transform

transform算法概念:
transform算法用于对序列中的每个元素应用指定的操作,并将结果存储在另一个序列中。这个算法可以看作是一种投影操作,将一个序列映射到另一个序列。

示例代码:

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

int square(int x) {
    return x * x;
}

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

    // 使用transform算法,将numbers中的每个元素求平方,存储到squared_numbers中
    std::transform(numbers.begin(), numbers.end(), std::back_inserter(squared_numbers), square);

    // 输出squared_numbers中的元素
    for (int num : squared_numbers) {
        std::cout << num << " ";
    }
    
    return 0;
}

示例解释:

  1. 在示例代码中,我们定义了一个函数square,用于计算输入的值的平方。
  2. 首先创建了一个包含数字的vector容器numbers和一个空的vector容器squared_numbers。
  3. 然后使用transform算法,将numbers中的每个元素应用square函数进行平方操作,结果存储在squared_numbers中。
  4. 最后使用for循环打印输出squared_numbers中的元素,即每个数的平方值。
  5. 输出结果为:1 4 9 16 25。

通过transform算法,可以方便地对容器中的每个元素进行转换操作,并将结果存储在另一个容器中,减少了显式循环的编写。 transform算法提供了一种简洁而高效的方法来处理容器元素的映射操作。

C++遍历算法find

find算法概念:
find算法用于在容器中查找指定值第一次出现的位置,返回指向第一个等于该值的元素的迭代器,若未找到,则返回迭代器指向容器的末尾。
在这里插入图片描述

示例代码:

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

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

    // 在numbers中查找值为3的元素
    auto it = std::find(numbers.begin(), numbers.end(), 3);

    // 判断是否找到
    if (it != numbers.end()) {
        std::cout << "找到了值为3的元素,位置在索引 " << std::distance(numbers.begin(), it) << std::endl;
    } else {
        std::cout << "未找到值为3的元素" << std::endl;
    }

    return 0;
}

示例解释:

  1. 示例代码定义了一个包含数字的vector容器numbers。
  2. 使用find算法在numbers中查找值为3的元素,将返回值为3的元素的迭代器。
  3. 判断返回的迭代器是否指向了容器末尾,如果没有,打印出找到元素的位置;否则提示未找到元素。
  4. 输出结果为:“找到了值为3的元素,位置在索引 2”。

通过find算法,可以快速在容器中查找特定值第一次出现的位置。如果找到了指定值,find将返回指向该元素的迭代器;否则返回迭代器指向容器末尾,可以通过判断迭代器是否等于end()来确定是否找到了目标元素。这个算法在实际开发中经常被使用。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 热题 HOT 100(P1~P10)

&#x1f525; LeetCode 热题 HOT 100 这里记录下刷题过程中的心得&#xff0c;其实算法题基本就是个套路问题&#xff0c;很多时候你不知道套路或者模板&#xff0c;第一次尝试去做的时候就会非常懵逼、沮丧和无助。而且就算你一时理解并掌握了&#xff0c;过一段时间往往会绝…

#WEB前端(CSS基础)

1.实验&#xff1a;HTML是网页骨架&#xff0c;CCS是网页装修 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; style 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

为什么模电这么难学?这是我见过最好的回答

大家好&#xff0c;我是砖一&#xff0c;有很多人抱怨模电难学&#xff0c;被誉为电子信息挂科率最高之一&#xff0c;下面听我分析一下为啥模电这么难学&#xff1f; 01 理科的抽象思维 在高等教育体系中&#xff0c;模电是涉及半导体方向的第一门工程类课程&#xff0c;是一…

Unity中URP下实现水体(C#动态生成渐变图)

文章目录 前言一、Shader部分1、申明水渐变图纹理和采样器2、在片元着色器&#xff0c;进行纹理采样&#xff0c;并且输出 二、C#脚本部分1、我们新建一个C#脚本2、我们定义两个变量3、在Start内&#xff0c;new 一个Texture2D(宽&#xff0c;高)4、定义一个Color[宽*高]的颜色…

Flink状态存储-StateBackend

文章目录 前言一、MemoryStateBackend二、FSStateBackend三、RocksDBStateBackend四、StateBackend配置方式五、状态持久化六、状态重分布OperatorState 重分布KeyedState 重分布 七、状态过期 前言 Flink是一个流处理框架&#xff0c;它需要对数据流进行状态管理以支持复杂的…

25高数考研张宇 -- 公式总结(更新中)

1. 两个重要极限 (1) lim ⁡ x → 0 sin ⁡ x x 1 \lim _{x \rightarrow 0} \frac{\sin x}{x}1 limx→0​xsinx​1, 推广形式 lim ⁡ f ( x ) → 0 sin ⁡ f ( x ) f ( x ) 1 \lim _{f(x) \rightarrow 0} \frac{\sin f(x)}{f(x)}1 limf(x)→0​f(x)sinf(x)​1. (2) lim ⁡…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

BEVFusion

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准&#xff0c;当前的方法依赖于激光雷达传感器的点云作为查询&#xff0c;以利用图像空间的特征。然而&#xff0c;人们发现&#xff0c;这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…

U盘弹出提示“该设备正在使用中”:原因与解决方案

在日常使用U盘时&#xff0c;我们可能会遇到一个问题&#xff1a;当尝试安全弹出U盘时&#xff0c;系统提示“该设备正在使用中”。这种情况可能会让用户感到困惑&#xff0c;担心数据是否安全或是否会导致U盘损坏。本文旨在探讨这一现象背后的原因&#xff0c;并提供相应的解决…

Python 自动化给女友发邮件:含新闻、天气、每日一句、图片 最全攻略系列02 如何添加emoji

Python 自动化给女友发邮件:含新闻、天气、每日一句、图片 最全攻略系列 是否想在女友面前展示程序员炫酷的一面? 是否想给她每日问候但是害怕忘记固定时间发送信息? 是否也羡慕别人可以优雅使用Python定时发送邮件? 欢迎来到Python自动化发邮件最全攻略系列,本系列将…

软考54-上午题-【数据库】-关系模式的范式-真题

一、范式总结 第一步&#xff0c;先求候选码&#xff0c;由此得到&#xff1a;主属性、非主属性。 二、判断部分函数依赖的技巧 【回顾】&#xff1a;部分函数依赖 &#xff08;X&#xff0c;Y&#xff09;——>Z&#xff1b; X——>Z 或者 Y——>Z 题型&#xff1a;给…

对单元测试的思考(稳定性建设)

单测是很常见的技术的名词&#xff0c;但背后的逻辑和原理你是否清楚&#xff0c;让我们一起review一下。 1. 单测是什么&#xff1f;&#x1f914; 单测是单元测试,主要是测试一个最小逻辑块。比如一个函数、一个react、vue 组件。 2.为什么要写单测&#xff1f;&#x1f9…

《Large Language Models for Generative Information Extraction: A Survey》阅读笔录

论文地址&#xff1a;Large Language Models for Generative Information Extraction: A Survey 前言 映像中&#xff0c;比较早地使用“大模型“”进行信息抽取的一篇论文是2022年发表的《Unified Structure Generation for Universal Information Extraction》&#xff0c;也…

c++基础知识补充4

单独使用词汇 using std::cout; 隐式类型转换型初始化&#xff1a;如A a1,,此时可以形象地理解为int i1;double ji;&#xff0c;此时1可以认为创建了一个值为1的临时对象&#xff0c;然后对目标对象进行赋值&#xff0c;当对象为多参数时&#xff0c;使用&#xff08;1&#xf…

2024最新算法:电鳗觅食优化算法(Electric eel foraging optimization,EEFO)求解23个基准函数(提供MATLAB代码)

一、电鳗觅食优化算法 电鳗觅食优化算法&#xff08;Electric eel foraging optimization,EEFO&#xff09;由Weiguo Zhao等人提出的一种元启发算法&#xff0c;EEFO从自然界中电鳗表现出的智能群体觅食行为中汲取灵感。该算法对四种关键的觅食行为进行数学建模&#xff1a;相…

2000-2021年各省互联网普及率数据

2000-2021年各省互联网普及率数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;省级&#xff1a;行政区划代码、地区、年份、互联网普及率(%) 3、来源&#xff1a;互联网络信息中心&#xff1b;各地统计局 4、指标解释&#xff1a;指互联网用户数占常住人口总数的比…

环形链表详解(让你彻底理解环形链表)

文章目录 一.什么是环形链表&#xff1f;二.环形链表的例题&#xff08;力扣&#xff09; 三.环形链表的延伸问题 补充 一.什么是环形链表&#xff1f; 环形链表是一种特殊类型的链表数据结构&#xff0c;其最后一个节点的"下一个"指针指向链表中的某个节点&#xff…

【tableau学习笔记】tableau无法连接数据源

【tableau学习笔记】tableau无法连接数据源 背景&#xff1a; 学校讲到Tableau&#xff0c;兴奋下载Kaggle Excel&#xff0c;一看后缀CSV&#xff0c;导入Tableau发现报错“tableau无法连接数据源”&#xff0c;自作聪明改为后缀XLSX&#xff0c;bug依旧。 省流&#xff1a…

QML中动态表格修改数据

1.qml文件中的实现代码 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_model…