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

news2025/1/20 20:01:58

文章目录

  • 前言
  • 一、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 == v2
    if (v1 == v2)
        std::cout << "v1 is equal to v2" << std::endl;
    else
        std::cout << "v1 is not equal to v2" << std::endl;

    // v1 != v2
    if (v1 != v2)
        std::cout << "v1 is not equal to v2" << std::endl;
    else
        std::cout << "v1 is equal to v2" << std::endl;

    // v1 <= v2
    if (v1 <= v2)
        std::cout << "v1 is less than or equal to v2" << std::endl;
    else
        std::cout << "v1 is greater than v2" << std::endl;

    // v1 >= v2
    if (v1 >= v2)
        std::cout << "v1 is greater than or equal to v2" << std::endl;
    else
        std::cout << "v1 is less than v2" << std::endl;

    // v1 < v2
    if (v1 < v2)
        std::cout << "v1 is less than v2" << std::endl;
    else
        std::cout << "v1 is not less than v2" << std::endl;

    // v1 > v2
    if (v1 > v2)
        std::cout << "v1 is greater than v2" << std::endl;
    else
        std::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.coloradmin.cn/o/925504.html

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

相关文章

基本概念【算术、 关系、逻辑、位、字符串、条件、优先级等运算符】(三)-全面详解(学习总结---从入门到深化)

文章目录 运算符(operator) 算术运算符 赋值及其扩展赋值运算符 关系运算符 逻辑运算符 位运算符 字符串连接符 条件运算符 运算符优先级的问题 数据类型的转换 自动类型转换 强制类型转换 Scanner 处理键盘输入 运算符(operator) 计算机的基本用途就是执行数学运…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Elasticsearch示例(2)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

每日一题 113路径总和||(递归)

题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22…

脱离束缚:数字化工厂中ARM控制器的革命性应用!

近年来&#xff0c;中国数字经济体系已进入高速增长阶段。制造业作为中国经济高质量发展的重要支撑力量&#xff0c;在面临生产成本不断上涨、关键装备和核心零部件“受制于人”等挑战时&#xff0c;建设数字化工厂已成必然。 数字化工厂数据采集出现的问题 在数字工厂的建设…

两个步骤让图片动起来!

在当今数字时代&#xff0c;动态图片已经成为了网页设计和移动应用设计的标配之一。动态图片能够吸引用户的注意力&#xff0c;提高用户体验和页面交互性。那么&#xff0c;图片怎么动起来&#xff1f;有什么好用的方法呢&#xff1f;下面我们来一起探讨一下。 通常我们认知的动…

【分布式技术专题】「OSS中间件系列」从0到1的介绍一下开源对象存储MinIO技术架构

MinIO背景介绍 MinIO创始者是Anand Babu Periasamy, Harshavardhana&#xff08;戒日王&#xff09;等人&#xff0c; Anand是GlusterFS的初始开发者、Gluster公司的创始人与CTO&#xff0c;Harshavardhana曾经是GlusterFS的开发人员&#xff0c;直到2011年红帽收购了Gluster公…

Web安全测试(三):SQL注入漏洞

一、前言 结合内部资料&#xff0c;与安全渗透部门同事合力整理的安全测试相关资料教程&#xff0c;全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试&#xff0c;覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬&#xff01; 全部…

IDEA启动两个Tomcat服务的方式 使用nginx进行反向代理 JMeter测试分布式情况下synchronized锁失效

目录 引出IDEA启动Tomcat两个端口的方式1.编辑配置2.添加新的端口-Dserver.port80833.service里面管理4.启动后进行测试 使用nginx进行反向代理反向代理多个端口运行日志查看启动关闭重启 分布式情况下synchronized失效synchronized锁代码启动tomcat两个端口nginx反向代理JMete…

实验七 Linux 内核移植

【实验目的】 掌握 Linux 内核配置和编译的基本方法 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&#xff0c;以“#”开头的命令表 示在开发板下…

C++信息学奥赛1139:整理药名

#include <iostream> #include <string> using namespace std; int main() {int n;// 输入整数ncin>>n;cin.ignore();string arr[n];// 循环读取n行字符串for (int i 0; i<n ;i){getline(cin,arr[i]);}for (int i 0; i<n ;i){for(int j0;j<arr[i]…

【JSDocvscode】使用JSDoc、在vscode中开启node调试、使用vscode编写运行Python程序

JSDoc JSDoc是JavaScript的一种注释语法&#xff0c;同时通过JSDoc注释也可以规避js弱类型中不进行代码提示的问题 图形展示JSDoc的效果&#xff1a; 上述没有进行JSDoc&#xff0c;然后我们a点什么 是没有任何提示的 上述就是加上 JSDoc的效果 常用的 vscode 其实内置了 js…

IBM Spectrum LSF License Scheduler

LSF License Scheduler 提供了两个版本: Basic Edition 和 Standard Edition。 LSF License Scheduler Basic Edition 随附于 LSF Standard Edition 和 Advanced Edition &#xff0c;并非旨在应用有关如何在集群或项目之间共享许可证的策略。 相反&#xff0c; LSF License S…

[JavaWeb]【十四】web后端开发-MAVEN高级

目录 一、分模块设计与开发 1.1 分模块设计 1.2 分模块设计-实践​编辑 1.2.1 复制老项目改为spring-boot-management 1.2.2 新建maven模块runa-pojo 1.2.2.1 将原项目pojo复制到runa-pojo模块 1.2.2.2 runa-pojo引入新依赖 1.2.2.3 删除原项目pojo包 1.2.2.4 在spring-…

postman 调用webservice

有个外部接口需要提供古老的webservice 格式接口。 1 设置格式 按照xml 格式设置。 2 消息体xml 封装 不加envelope: <soap:Envelope xmlns:soap"" target"_blank">http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap…

硬盘中病毒是什么原因?硬盘格式化能清除病毒吗

“我的电脑中了一个非常顽固的病毒&#xff0c;朋友建议我进行硬盘格式化来彻底清除病毒。不知道是不是真的有用&#xff0c;半信半疑下进行了硬盘格式化。当我完成操作后&#xff0c;我发现有些工作文件没有备份到。这可怎么办&#xff1f;想问下大家有没有什么方法去恢复数据…

ClickHouse进阶(二):ClickHouse MergeTree表引擎及目录解析

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

【VS Code插件开发】消息通信(四)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…

ModaHub魔搭社区:WinPlan垂直大模型数据采集

WinPlan经营大脑数据手动提交 数据采集模版创建后,用户可手动提交数据 数据批量导入 1、第一步:上传Excel 如何选择Excel本系统的批量导入支持选择任意相关的Excel,映射到数据采集模版的各列,即可实现批量导入;相关Excel可以是自行维护的相关数据、或从其他业务系统导出…

【C语言】文件操作 -- 详解

一、什么是文件 磁盘上的文件是文件。 1、为什么要使用文件 举个例子&#xff0c;当我们想实现一个 “通讯录” 程序时&#xff0c;在通讯录中新建联系人、删除联系人等一系列操作&#xff0c;此时的数据存储于内存中&#xff0c;程序退出后所有数据都会随之消失。为了让通讯录…

vue-admin-template实现按钮级控制

这里记录一下使用大佬的模板vue-admin-template&#xff0c;实现按钮级别控制 实现的思路&#xff1a;用户登录之后&#xff0c;返回用户详细信息(将用户的所有权限码发送给前端)&#xff0c;然后将权限码保存在全局状态管理对象中&#xff0c;然后在组件中进行判断是否显示 最…