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

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

前言


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;
}


145395f2754144698f95700cf9b7b393.png

输出结果:

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;
}


fc9ef2b5363c4c12ab5dbddda18e232b.png

输出结果:

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;
}


37660735cc1342d39afd87a65e0bb8ee.png


输出结果:

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;
}


7c72a85a9d9c44e9b97c667c0c9a3dcd.png


输出结果:

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;
}


c86f3a7e4ec446bb9ac4897e30d8cb68.png

输出结果:

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;
}


9c08da739108417890b8d060eb1211fa.png

输出结果:

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的运算和算法有所帮助。谢谢阅读!

相关文章
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
305 2
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
361 17
|
存储 机器学习/深度学习 算法
基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
384 4
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
335 0
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
348 4
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
370 8
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
434 0

热门文章

最新文章