【C++修行之道】STL(初识pair、vector)

目录

一、pair

1.1pair的定义和结构

1.2pair的嵌套

1.3pair自带排序规则

1.4代码示例 

二、vector

2.1vector的定义和特性

2.2vector的初始化

一维初始化:

2.3vector的常用函数

2.4vector排序去重

排序:

去重:

示例:


一、pair

1.1pair的定义和结构

在C++中,pair是一个模板类,用于一对值的组合。它位于<utility>头文件中。pair类的定义如下:

template<class T1,class T2>
struct pair {T1 fiest;//第一个值T2 second;//第二个值//构造函数pair();pair(const T1& x, const T2& y);//比较运算符重载bool operator ==(const pair& rhs)const;bool operator !=(const pair& rhs)const;//其他成员函数和特性//...
};
  • pair类模板有两个模板参数,T1和T2,分别表示第一个值和第二个值的类型。
  • pair类有两个成员变量,first和second,分别表示第一个值和第二个值。
  • pair类还有一些成员函数和特性,例如默认构造函数、带参数的构造函数、比较运算符重载等。
  • 使用pair类,你可以方便地将两个值组合在一起,并进行传递、存储和操作。

例如,可以将两个整数组合在一起作为函数的返回值,或者将一对值存储在容器中

下面是一些使用pair的示例:

int main()
{pair<int, double>p1(1, 3.14);pair<char, string>p2('a', "hello");cout << p1.first << ", " << p1.second << endl;cout << p2.first << ", " << p2.second << endl;}

以上代码创建了两个pair对象,分别包含不同类型的值。然后,通过访问fisrt和second成员变量,输出了这些值。

1.2pair的嵌套

pair可以进行嵌套,也就是说可以将一个pair对象做为另一个pair对象的成员。通过嵌套pair,你可以方便组合多个值,并形成更复杂的数据结构。

例如,你可以创建一个三维坐标系的点,其中第一个维度由第一个整数表示,第2,3个维度由一个pair表示。

下面是一个示例代码,演示了如何嵌套使用pair:

#include <iostream>   
#include <utility>  using namespace std; int main()  
{  // 创建一个包含两个整数的pair对象p1,初始化为(1, 2)  pair<int, int> p1(1, 2);  // 创建一个pair对象p2,其第一个元素是整数3,第二个元素是另一个pair<int, int>对象,初始化为(4, 5)  pair<int, pair<int, int>> p2(3, make_pair(4, 5));  // 创建一个pair对象p3,其两个元素都是pair<int, int>对象,分别初始化为(6, 7)和(8, 9)  pair<pair<int, int>, pair<int, int>> p3(make_pair(6, 7), make_pair(8, 9));  // 打印p1的第一个和第二个元素  cout << p1.first << ", " << p1.second << endl;  // 打印p2的第一个元素,以及p2的第二个元素的第一个和第二个子元素  cout << p2.first << ", " << p2.second.first << ", " << p2.second.second << endl;  // 打印p3的第一个元素的第一个和第二个子元素,以及p3的第二个元素的第一个和第二个子元素  cout << p3.first.first << ", " << p3.first.second << ", " << p3.second.first << ", " << p3.second.second << endl;  return 0; // 程序正常退出  
}

1.3pair自带排序规则

pair自带的排序规则是按照first成员进行升序排序。

如果first成员相等,则按照second成员进行升序排序。

这意味着当你使用标准库中的排序算法(如std::sort)对包含pair对象的容器进行排序时,会根据pair对象的first成员进行排序。

下面是一个示例代码,演示了如何使用pair进行排序:

#include<iostream>
#include<utility>
#include<vector>
#include<algorithm>int main()
{vector<pair<int, int>>vec;vec.push_back(make_pair(3, 2));vec.push_back(make_pair(1, 4));vec.push_back(make_pair(2, 1));sort(vec.begin(), vec.end());for (const auto& p : vec) {cout << p.first << ", " << p.second << endl;}return 0;
}

1.4代码示例 

#include<iostream>
#include<utility>
#include<vector>//定义一个结构体,表示一个人的信息
struct Person {string name;int age;};int main()
{//创建一个存储Person对象的向量vector<Person> people;//添加一些Person对象到向量中people.push_back({ "Alice",25 });people.push_back({ "Bod",30 });people.push_back({ "Charlie",20 });//创建一个存储pair的向量,每个pair包含一个Person对象和一个评分vector<pair<Person, int>>scores;//添加一些pair到向量中scores.push_back({ people[0],90 });scores.push_back({ people[1],85 });scores.push_back({ people[2],95 });//遍历pair向量,并输出每个人的姓名,年龄和评分for (const auto& pair : scores) {cout << "Name: " << pair.first.name << endl;cout << "Age: " << pair.first.age << endl;cout << "Score: " << pair.second << endl;cout << endl;}return 0;
}

二、vector

2.1vector的定义和特性

在C++中,vector是一个动态数组容器可以存储一系列相同类型的元素.
它是标准库<vector>中定义的模板类。

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。

vector的定义和结构非常简单,它由以下几个重要的部分组成:

模板类声明:vector是一个模板类,因此在使用之前需要包含头文件<vector>。声明一个vector对象的通用语法如下:

std::vector<T> vec;

这里的T是要存储在vector中的元素类型。

  • 容器大小:vector是一个动态数组,可以根据需要自动调整大小。 它会根据元素的数量动态分配内存空间。
  • 容器大小管理:可以使用size()函数获取vector中元素的数量,使用empty()函数检查vector是否为空,还可以使用resize()函数调整ector的大小。
  • 迭代器: vector提供了迭代器,可以用于遍历容器中的元素。可以使用begin()函数获取指向第一个元素的迭代器,使用end()函数获取指向最后一个元素之后位置的迭代器。

在局部作用域内(例如局部函数内部),创建vector对象时,其内部数组是在堆空间中分配的。

通常,在局部作用域内直接声明的数组是分配在栈空间上的。由于栈空间相对有限,如果声明了过大的数组,很容易引发栈溢出错误。

因此,在局部作用域内,我们应避免声明长度过大的数组,但可以选择使用vector。vector能够动态地在堆空间中管理内存,从而支持存储大量元素而不会导致栈溢出。这使得vector成为处理大量数据的局部变量的理想选择。

2.2vector的初始化

一维初始化:

vector<int> a; //定义了一个名为a的一维数组,数组存储int类型数据
vector<double> b;//定义了一个名为b的一维数组,数组存储double类型数据// 定义结构体 Node  
struct Node {  int id;  std::string name;
}
vector<Node> c;//定义了一个名为c的一维数组,数组存储结构体类型数据,node是结构体类型

指定长度和初始值的初始化

vector<int> v(n);// 定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]
vector<int> v(n, 1);// v[0] 到 v[n - 1]所有的元素初始值均为1
//注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

2.3vector的常用函数

push_back():将元素添加到vector的末尾

void push back(const T&value);

pop_back():删除vector末尾的元素(保证vector非空)

void pop_back();

begin()和 end(): 返回指向vector第一个元素和最后一个元素之后位置的迭代器

iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;

示例:

std::vector<int> vec = {10,20,30};
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}

2.4vector排序去重

排序:

要对vector进行排序,可以使用标准库中的std::sort函数。

该函数位于头文件<algorithm>中。

#include <algorithm>
std::vector<T> vec = {...};
std::sort(vec.begin(),vec.end());

这里的T是vector中元素的类型。std::sort函数接受两个迭代器参数,表示要排序的范围。

vec.begin()返回指向vector第一个元素的迭代器。

vec.end()返回指向最后一个元素之后位置的迭代器

去重:

要去除vector中的重复元素,可以使用std:unique函数。该函数位于头文件<algorithm>中

#include <algorithm>std::vector<T> vec = [...};
std::sort(vec.begin(),vec.end()); 
auto last = std::unique(vec.begin(), vec.end());
vec.erase(last,vec.end());

首先,需要对vector进行排序,以便相同的元素相邻。然后,std:unique函数将重复的元素移动到vector的末尾,并返回一个指向重复元素的迭代器。最后,可以使用vec.erase函数将重复元素从vector中删除。

示例:

#include<iostream>
#include<vector>
#include<algorithm>using namespace std;int main()
{vector<int>vec = { 2,1,3,2,4,1,5,4 };sort(vec.begin(), vec.end());auto last = unique(vec.begin(), vec.end());vec.erase(last, vec.end());for (const auto&num : vec) {cout << num << " ";}cout << endl;return 0;
}

#include<iostream>
#include<vector>
#include<algorithm>using namespace std;int main()
{//创建一个空的 std::vector 对象std::vector<int> numbers;//向向量中添加元素numbers.push_back(5);numbers.push_back(2);numbers.push_back(8);numbers.push_back(5);numbers.push_back(1);numbers.push_back(2);numbers.push_back(9);numbers.push_back(8);//打印向量中的元素cout << "原始向量中的元素: ";for (const auto& number : numbers) {cout << number << " ";}cout << endl;//对向量进行排序sort(numbers.begin(), numbers.end());//打印排序后的向量cout << "排序后的向量: ";for (const auto& number : numbers) {cout << number << " ";}cout << endl;//去除重复元素numbers.erase(std::unique(numbers.begin(), numbers.end()), numbers.end());//打印去重个后的向量cout << "去重后的向量: ";for (const auto& number : numbers) {cout << number << " ";}cout << endl;//向向量中插入元素numbers.insert(numbers.begin() + 2, 3);//打印插入元素后的向量cout << "插入元素后的向量: ";for (const auto& number : numbers) {cout << number << endl;}cout << endl;//删除向量中的某个元素numbers.erase(numbers.begin() + 4);//打印删除元素后的向量cout << "删除元素后的向量: ";for (const auto& number : numbers) {cout << number << endl;}cout << endl;//检查向量是否为空if (numbers.empty()) {cout << "向量为空" << endl;}else {cout << "向量不为空" << endl;}//获取向量的大小cout << "向量的大小: " << numbers.size() << endl;//清空向量numbers.clear();//检查向量是否为空if (numbers.empty()) {cout << "向量为空" << endl;}else {cout << "向量不为空" << endl;}return 0;
}

今天就先到这了!!!

 

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

宠物空气净化器推荐哪个好?实惠的猫用猫用净化器牌子测评

作为宠物主人&#xff0c;我们深知养宠物的乐趣和责任&#xff0c;但同时也面临着一些挑战&#xff0c;比如宠物掉毛、异味和空气质量等问题。这就是为什么越来越多的家庭选择宠物空气净化器&#xff0c;为我们创造一个清新、健康的室内环境。 无论我们多么爱我们的毛茸茸伙伴…

STM32(--001) Win10、Win11 上的驱动安装说明

一、USB线插到 CMSIS-DAP 接口上&#xff0c;将自动识别到两个设备 ① CMSIS-DAP&#xff1a;用于烧录代码、在线硬件仿真; 在Keil里烧录&#xff0c;无需通过FlyMCU; ② USB转TTL&#xff1a;用于开发板与电脑间串口通信 &#xff0c;即USART1, TX-PA9、RX-PA10; 接口备注&a…

UDP和TCP代理协议有什么区别?哪个更好

在互联网的世界里&#xff0c;数据传输的方式有很多种&#xff0c;其中 UDP 和 TCP 是两种常见的传输协议。而代理协议则是为了在网络中传输数据时提供安全、稳定和高效的传输环境。那么&#xff0c;UDP 和 TCP 代理协议有什么区别呢&#xff1f;哪个更好呢&#xff1f;接下来&…

web系统服务器监控检查

一、检查操作系统是否存在增减文件&#xff0c;是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传&#xff0c;您可以按照以下步骤进行操作&#xff1a; 文件完整性检查&#xff1a; 使用文件系统的完整性检查工具&#xff0c;例如fsck&#xff08;对于ext…

Linux之快速入门

一、Linux目录结构 从Windows转到Linux最不习惯的是什么&#xff1a; 目录结构 Windows会分盘&#xff0c;想怎么放东西就怎么放东西&#xff0c;好处自由&#xff0c;缺点容易乱 Linux有自己的目录结构&#xff0c;不能随随便便放东西 /&#xff1a;根目录/bin:二进制文件&…

Mapbox加载浙江省天地图服务和数据处理

1. 加载影像服务 通过浙江省天地图官网申请所需服务&#xff0c;使用token获取服务数据 由于浙江省天地图使用的坐标系是 cgcs2000&#xff0c;需要使用 的框架对应为 cgcs2000/mapbox-gl&#xff0c;通过cdn引入或npm下载 影像服务地址为&#xff1a; ‘https://ditu.zjzw…

力扣hot100 环形链表 快慢指针 哈希 数学公式

Problem: 142. 环形链表 II 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) /** /*** Definition for singly-linked list.* class ListNode {* int val;* …

Vector源码

Vector源码 总结 Vector底层采用数组对元素进行存储&#xff0c;与ArrayList不同的是使用synchronized保障了线程安全&#xff0c;并且扩容机制为原容量的1.5倍&#xff0c;而数组的初始化时机是调用构造方法后&#xff0c;ArrayList是调用add方法后,由于读和写都加了锁&…

Pytorch自动求导机制

PyTorch框架可以帮我们计算好反向传播&#xff0c;需要求导的&#xff0c;可以手动定义 示例&#xff1a; #先构造一个随机的三行四列矩阵&#xff0c;两种方法都可以#方法1 x torch.randn(3,4,requires_gradTrue) x#方法2 x torch.randn(3,4) x.requires_gradTrue x #再构…

基于springboot+vue的在线文档管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

鸿蒙原生应用/元服务实战-Serverless云存储创建失败

新账户&#xff0c;Serverless云存储没法创建 &#xff0c;没法进行下一步&#xff0c;有没有遇到同样问题与解决思路方式的。

首批!鸿蒙千帆起,生态全面启动

在近日举办的鸿蒙生态千帆启航仪式上&#xff0c;华为常务董事、终端BG CEO余承东表示&#xff0c;鸿蒙生态设备已经增至8亿 &#xff0c;将打开万亿产业新蓝海。 在本次论坛上&#xff0c;华为宣布HarmonyOS NEXT鸿蒙星河版&#xff08;开发者预览版&#xff09;已面向开发者…

【优先级队列 之 堆的实现】

文章目录 前言优先级队列 PriorityQueue优先队列的模拟实现 堆堆的储存方式堆的创建建堆的时间复杂度堆的插入与删除 总结 前言 优先级队列 PriorityQueue 概念&#xff1a;对列是先进先出的的数据结构&#xff0c;但有些情况&#xff0c;数据可能带有优先级&#xff0c;一般出…

Canvas-Editor 实现类似 Word 协同编辑

前言 对于word的协同编辑&#xff0c;已经构思很久了&#xff0c;但是没有找到合适的插件。今天推荐基于canvas/svg 的富文本编辑器 canvas-editor&#xff0c;能实现类似word的基础功能&#xff0c;如果后续有更好的&#xff0c;也会及时更新。 Canvas-Editor 效果图 官方文…

redis-exporter grafana面板配置

一、前言 关于使用tensuns自带的grafana监控模板&#xff0c;监控redis-exporter接口会有一些数据丢失的问题&#xff0c;需要自行修改一下grafana模板的json 二、修改模板 redis grafana模板id&#xff1a;17507 主要是针对cpu使用率和内存使用率做一个说明&#xff0c;因为…

Acwing-语法基础练习

目录 1. 非常基础的C (面向程序) 框架 2. 一些基础数据类型 3.变量的输入输出 4.ACWing题库-第1题&#xff1a;AB 5.四则运算(只整理一部分较难的) 6.数据类型转换 寒假自学用,记录Acwing题目。 语言&#xff1a;C 1. 非常基础的C (面向程序) 框架 #include <iostre…

STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写

文章目录 1、准备材料2、实验目标3、实验流程3.0、前提知识3.1、CubeMX相关配置3.1.0、工程基本配置3.1.1、时钟树配置3.1.2、外设参数配置3.1.3、外设中断配置 3.2、生成代码3.2.0、配置Project Manager页面3.2.1、外设初始化调用流程3.2.2、外设中断调用流程3.2.3、添加其他必…

C#winform上位机开发学习笔记7-串口助手的波特率参数设置功能添加

1.功能描述 上位机与下位机进行通讯时需要用到波特率设置功能&#xff0c;以及尝试与下位机实体进行通讯。 2.代码部分 步骤1&#xff1a;串口开启按钮事件中添加代码 serialPort1.BaudRate Convert.ToInt32(comboBox14.Text, 10);//将十进制的文本转换为32位整型赋值给串…

揭秘真相!成都力寰璨泓科技有限公司抖音小店究竟是否可靠?

在互联网电商繁荣发展的今天&#xff0c;抖音小店作为新兴的电商平台&#xff0c;吸引了众多商家和消费者的目光。在这其中&#xff0c;成都力寰璨泓科技有限公司的抖音小店尤为引人注目。那么&#xff0c;这家公司在抖音小店的运营是否可靠呢&#xff1f;本文将为你揭开真相。…