【C++STL基础入门】vector运算和遍历、排序、乱序算法

文章目录

  • 前言
  • 一、vector运算符
    • 1.1 比较运算符
      • vector有哪些比较运算符?
      • 示例代码
      • 注意
    • 1.2 下标运算符
  • 二、算法
    • 2.1 算法需要的头文件
    • 2.2 遍历算法
    • 2.3 排序算法
      • 从大到小
      • 从小到大
    • 2.4 乱序算法
  • 总结


前言

C++标准库提供了丰富的容器和算法,其中vector是最常用的容器之一。它以动态数组的形式存储元素,并提供了许多方便的运算符和算法来操作和处理数据。本文将介绍vector的基本运算、遍历方法、排序算法以及乱序算法。通过学习这些内容,您将能够更加灵活、高效地使用vector容器。


一、vector运算符

1.1 比较运算符

vector有哪些比较运算符?

在vector中,有下面这些比较运算符的重载
1、v1 == v2
2、v1 != v2
3、v1 <= v2
4、v1 >= v2
5、v1 < v2
6、v1 > v2

示例代码

#include <iostream>
#include <vector>int main() {std::vector<int> v1 = {1, 2, 3};std::vector<int> v2 = {1, 2, 3};// v1 == v2if (v1 == v2)std::cout << "v1 is equal to v2" << std::endl;elsestd::cout << "v1 is not equal to v2" << std::endl;// v1 != v2if (v1 != v2)std::cout << "v1 is not equal to v2" << std::endl;elsestd::cout << "v1 is equal to v2" << std::endl;// v1 <= v2if (v1 <= v2)std::cout << "v1 is less than or equal to v2" << std::endl;elsestd::cout << "v1 is greater than v2" << std::endl;// v1 >= v2if (v1 >= v2)std::cout << "v1 is greater than or equal to v2" << std::endl;elsestd::cout << "v1 is less than v2" << std::endl;// v1 < v2if (v1 < v2)std::cout << "v1 is less than v2" << std::endl;elsestd::cout << "v1 is not less than v2" << std::endl;// v1 > v2if (v1 > v2)std::cout << "v1 is greater than v2" << std::endl;elsestd::cout << "v1 is not greater than v2" << std::endl;return 0;
}

在这里插入图片描述
输出结果:

v1 is equal to v2
v1 is not equal to v2
v1 is less than or equal to v2
v1 is greater than or equal to v2
v1 is not less than v2
v1 is not greater than v2

注意

这些运算符对vector进行按元素比较,如果两个vector的元素数量相同且对应位置的元素相等,则认为它们是相等的。而在大小比较方面,会比较两个vector的字典序。

1.2 下标运算符

在前面我们已经讲过了vector的下标运算符了,在这里我们直接看一个示例代码吧

示例代码如下:

#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3, 4, 5};// 获取指定索引位置的元素值int index = 2;int value = v[index];std::cout << "Value at index " << index << ": " << value << std::endl;return 0;
}

在这里插入图片描述

输出结果:

Value at index 2: 3

在这个示例代码中,我们创建了一个整数类型的vector v,然后使用方括号运算符 [] 获取了索引为2的元素值,并将其存储到整数变量 value 中。最后,我们将索引和对应的值输出到控制台。
请注意,向量的索引是从0开始的,因此索引2对应着第3个元素。在示例中,我们获取到了索引为2的元素,其值为3。

二、算法

2.1 算法需要的头文件

#include <algorithm>

2.2 遍历算法

函数原型:

template<class InputIterator, class Function>
Function for_each(InputIterator _First,  InputIterator _Last, Function _Func );

函数模板for_each用于对指定范围内的元素应用一个函数,它接受以下参数:

InputIterator _First:这是一个迭代器,指向要应用函数的范围的第一个元素。
InputIterator _Last:这是一个迭代器,指向应用函数范围后面的一个位置(即不包含在范围内)。
Function _Func:这是一个可调用对象(函数、函数指针、lambda表达式等),它将被应用于范围内的每个元素。
for_each函数会按顺序遍历范围内的每个元素,并将每个元素作为参数传递给函数_Func进行处理。

示例代码如下所示:

#include <iostream>
#include <vector>
#include <algorithm>void display(int num) {std::cout << num << " ";
}int main() {std::vector<int> v = {1, 2, 3, 4, 5};std::cout << "Elements in vector: ";std::for_each(v.begin(), v.end(), display);std::cout << std::endl;return 0;
}

在这里插入图片描述

输出结果:

Elements in vector: 1 2 3 4 5

在这个示例代码中,我们创建了一个整数类型的vector v,并初始化它的元素。然后,我们定义了一个名为display的函数,用于输出传入的参数。接下来,我们使用for_each函数遍历整个vector,并将每个元素作为参数传递给display函数进行处理,从而显示出vector中的所有元素。

2.3 排序算法

从大到小

函数原型:

template<class RandomAccessIterator>
void sort(RandomAccessIterator _First, RandomAccessIterator _Last );

函数sort是C++标准库中的一个排序算法,它用于对指定范围内的元素进行排序。下面是sort函数的参数解释:

1.RandomAccessIterator _First:这是一个迭代器,指向要排序范围的第一个元素。
2.RandomAccessIterator _Last:这是一个迭代器,指向排序范围后面的一个位置(即不包含在排序范围内)。

sort函数通过比较迭代器指向的元素来对范围进行排序,它可以用于各种类型的容器(如vector、array等)或原始数组。排序范围的开始位置由迭代器_First表示,结束位置由迭代器_Last表示。

示例代码如下所示:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> v = {5, 2, 8, 3, 1};std::cout << "Before sorting: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;std::sort(v.begin(), v.end());std::cout << "After sorting: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这里插入图片描述

输出结果:

Before sorting: 5 2 8 3 1
After sorting: 1 2 3 5 8

在这个示例代码中,我们创建了一个整数类型的vector v,并初始化它的元素。然后,我们使用sort函数对整个vector进行排序,通过v.begin()表示排序范围的开始位置,通过v.end()表示排序范围的结束位置。最后,我们输出排序前后的vector元素以验证排序结果。
希望这个例子能帮助您理解sort函数和其参数的使用!

从小到大

函数原型:

template<class RandomAccessIterator, class Pr>
void sort( RandomAccessIterator _First,  RandomAccessIterator _Last, BinaryPredicate _Comp);

函数sort是C++标准库中的一个排序算法,它用于对指定范围内的元素进行排序。下面是sort函数的参数解释:

RandomAccessIterator _First:这是一个迭代器,指向要排序范围的第一个元素。
RandomAccessIterator _Last:这是一个迭代器,指向排序范围后面的一个位置(即不包含在排序范围内)。
BinaryPredicate _Comp:这是一个二元谓词(函数对象或lambda表达式),用于指定元素的比较方式。
sort函数按照指定的比较规则对范围内的元素进行排序。排序范围的开始位置由迭代器_First表示,结束位置由迭代器_Last表示。比较规则由提供的二元谓词_Comp定义,用于比较两个元素的关系。默认情况下,如果不提供_Comp参数,sort函数将使用默认的比较操作符(<)进行排序。

示例代码如下所示:

#include <iostream>
#include <vector>
#include <algorithm>bool compare(int a, int b) {return a > b;
}int main() {std::vector<int> v = {5, 2, 8, 3, 1};std::cout << "Before sorting: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;std::sort(v.begin(), v.end(), compare);std::cout << "After sorting: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这里插入图片描述

输出结果:

Before sorting: 5 2 8 3 1
After sorting: 8 5 3 2 1

在这个示例代码中,我们创建了一个整数类型的vector v,并初始化它的元素。然后,我们定义了一个名为compare的二元谓词函数,用于按照降序对元素进行排序。接下来,我们使用sort函数对整个vector进行排序,通过v.begin()表示排序范围的开始位置,通过v.end()表示排序范围的结束位置,并传递自定义的比较函数compare作为第三个参数。最后,我们输出排序前后的vector元素以验证排序结果。

需要知道的事情:参数三 greater<>() 可以指定从大到小,其实他就是一个自定义的比较函数而已

2.4 乱序算法

函数原型:

void random_shuffle(RandomAccessIterator _First, RandomAccessIterator _Last );

函数random_shuffle是C++标准库中的一个算法,用于将指定范围内的元素进行随机重排。下面是random_shuffle函数的参数解释:

RandomAccessIterator _First:这是一个迭代器,指向要进行随机重排范围的第一个元素。
RandomAccessIterator _Last:这是一个迭代器,指向随机重排范围后面的一个位置(即不包含在范围内)。
random_shuffle函数通过随机交换元素的位置来实现重排。重排范围的开始位置由迭代器_First表示,结束位置由迭代器_Last表示。

示例代码如下所示:

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>int main() {std::vector<int> v = {1, 2, 3, 4, 5};std::cout << "Before shuffling: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;std::random_device rd;std::mt19937 g(rd());std::shuffle(v.begin(), v.end(), g);std::cout << "After shuffling: ";for (const auto& num : v) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这里插入图片描述

输出结果:

Before shuffling: 1 2 3 4 5
After shuffling: 3 5 1 2 4

在这个示例代码中,我们创建了一个整数类型的vector v,并初始化它的元素。然后,我们使用random_device和mt19937来生成一个随机数引擎对象 g。接下来,我们使用shuffle函数将整个vector随机重排,通过v.begin()表示重排范围的开始位置,通过v.end()表示重排范围的结束位置,并传递生成的随机数引擎对象g作为第三个参数。最后,我们输出重排前后的vector元素以验证结果。

乱序算法想看详细的请到C++11专栏进行了解:C++11保姆级教程----专栏


总结

本文介绍了vector容器的基本运算符和常用算法,包括遍历、排序和乱序。通过使用这些运算符和算法,我们可以更方便地操作和处理vector中的元素,提高代码的灵活性和效率。在实际开发中,根据需求选择合适的运算符和算法,将有助于更好地利用C++STL的强大功能。

希望本文对您理解vector的运算和算法有所帮助。谢谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《中国区块链发展报告(2023)》发布 和数集团推动区块链发展

北京区块链技术应用协会与社会科学文献出版社日前在京共同发布《区块链蓝皮书&#xff1a;中国区块链发展报告&#xff08;2023&#xff09;》。蓝皮书归纳梳理了2022年区块链产业发展现状及趋势&#xff0c;并结合行业热点Web3.0、AIGC&#xff0c;探讨我国区块链发展的热点话…

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…

【Unity】【Amplify Shader Editor】ASE入门系列教程第二课 硬边溶解

新建材质&#xff08;不受光照影响&#xff09; 拖入图片 设置 添加节点&#xff1a; 快捷键&#xff1a;K 组合通道&#xff1a;快捷键 V 完成图

解决运行在微信小程序中报[ app.json 文件内容错误] app.json: app.json 未找到(env: Windows,mp,1.05.2204

找到project.config.json文件夹 添加 "miniprogramRoot": "unpackage/dist/dev/mp-weixin/", 即可

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…

【使用 k 折叠交叉验证的卷积神经网络(CNN)】基于卷积神经网络的无特征EMG模式识别研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

很干的 Nginx

&#x1f3a8; 前言 本篇文章有些概念性的东西&#xff0c;是结合自己的理解表达出来的&#xff0c;可能有些理解不到位的地方。希望多多指教&#xff0c;谢谢大家。 红包献上 &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;…

全面介绍MES车间班次管理

一、什么是MES车间班次管理&#xff1f; MES车间班次管理是指利用制造执行系统&#xff08;MES&#xff09;来有效管理车间内的工人班次安排和生产计划。它涉及到车间人员的计划排班、考勤管理、生产数据的采集和分析等一系列工作。 二、MES车间班次管理的功能&#xff1a; 1…

SpringBoot概述SpringBoot基础配置yml的使用多环境启动

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SpringBoot简介 一、 SpringBoot概述1.1 起步依赖…

[MyBatis系列②]Dao层开发的两种方式

目录 1、传统开发 1.1、代码 1.2、存在的问题 2、代理开发 2.1、开发规范 2.2、代码 ⭐mybatis系列①&#xff1a;增删改查 1、传统开发 传统的mybatis开发中&#xff0c;是在数据访问层实现相应的接口&#xff0c;在实现类中用"命名空间.id"的形式找到对应的映…

docker可视化工具

安装Portainer 官方安装说明&#xff1a;https://www.portainer.io/installation/ [rootubuntu1804 ~]#docker pull portainer/portainer[rootubuntu1804 ~]#docker volume create portainer_data portainer_data [rootubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:90…

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…

CSS中如何实现多列布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 多列布局&#xff08;Multi-column Layout&#xff09;⭐ column-count⭐ column-width⭐ column-gap⭐ column-rule⭐ column-span⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧…

QT中资源文件resourcefile的使用,使用API完成页面布局

QT中资源文件resourcefile的使用 之前添加图标的方法使用资源文件的方法创建资源文件资源文件添加前缀资源文件添加资源使用资源文件中的资源 使用API完成布局使用QHBoxLayout完成水平布局使用QVBoxLayout完成垂直布局使用QGridLayout完成网格布局 在Qt中引入资源文件好处在于他…

pnpm无法加载文件 (解决方法 )

现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载。 pnpm安装&#xff1a; npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运…

若依前后端分离版本项目总结笔记

若依前后端分离学习笔试 1.路由问题 注意这个是前端找到你的路由的路径。 2.表格开关按钮快速实现 <el-table-column label"状态" align"center" key"status"><template slot-scope"scope"><el-switchv-model"s…

DevExpress WinForms数据编辑器组件,提供丰富的数据输入样式!(二)

DevExpress WinForms超过80个高影响力的WinForms编辑器和多用途控件&#xff0c;从屏蔽数据输入和内置数据验证到HTML格式化&#xff0c;DevExpress数据编辑库提供了无与伦比的数据编辑选项&#xff0c;包括用于独立数据编辑或用于容器控件(如Grid, TreeList和Ribbon)的单元格。…

柔性数组详解

柔性数组 1.前言 在c99标准中&#xff1a;允许结构体的最后一个变量是未知大小的数组&#xff0c;这就是柔性数组的来源。 例如&#xff1a; typedef struct type_a{ int i;int a[0];//柔性数组成员 }type_a;有些编译器可能会报错&#xff0c;那就使用下面这一种定义方式&…

房屋结构健康监测,科技助力让建筑更安全

房屋建筑是人们赖以生存的场所&#xff0c;然而当前我国许多房屋已经达到了使用寿命的中期&#xff0c;房屋的安全系数逐年降低&#xff0c;风险也随着时间的推移而累积。长期以来&#xff0c;我国的房屋普遍存在寿命短、隐患多的问题&#xff0c;“重建设&#xff0c;轻管理”…