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

news2024/11/24 0:46:48

目录

一、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.coloradmin.cn/o/1404894.html

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

相关文章

Redis(六)

1、Redis的缓存淘汰策略 1.1、内存配置 首先查看Redis最大的占用内存&#xff0c;打开redis配置文件&#xff0c;设置maxmemory参数&#xff0c;maxmemory是bytes字节类型&#xff0c;注意转换。 打开配置文件发现没有配置&#xff0c;那么默认是多少的内存&#xff0c;是这样…

[pytorch入门] 3. torchvision中的transforms

torchvision中的transforms 是transforms.py工具箱&#xff0c;含有totensor、resize等工具 用于将特定格式的图片转换为想要的图片的结果&#xff0c;即用于图片变换 用法 在transforms中选择一个类创建对象&#xff0c;使用这个对象选择相应方法进行处理 能够选择的类 列…

MAXWELL

MAXWELL 一、maxwell是什么 maxwell 官网地址&#xff1a;http://maxwells-daemon.io/ 因为官网是纯英文的&#xff0c;倒是不难懂&#xff0c;但总觉得写的略粗糙&#xff08;也可能笔者英文水平确实拉胯&#xff0c;有待提高&#xff09;。所以还是自己百度了一下。 当my…

实战:加密传输数据解密

前言 下面将分享一些实际的渗透测试经验&#xff0c;帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主&#xff0c;技巧为辅&#xff0c;进入逆向的大门。 技巧 开局先讲一下技巧&#xff0c;掌握好了技巧&#xff0c;方便逆向的时候可以更加快速的找到关键…

hpa自动伸缩

1、定义&#xff1a;hpa全称horizontal pod autoscaling&#xff08;pod的水平自动伸缩&#xff09;&#xff0c;这是k8s自带的模块。pod占用CPU的比率到达一定阀值会触发伸缩机制&#xff08;根据CPU使用率自动伸缩&#xff09; replication controller副本控制器&#xff0c…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及&#xff0c;越来越多的开发者和团队开始使用SVN&#xff08;Subversion&#xff09;来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程&#xff0c;帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

写给不耐烦程序员的 JavaScript 指南(五)

第七部分&#xff1a;集合 原文&#xff1a;exploringjs.com/impatient-js/pt_collections.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 下一步&#xff1a;30 同步迭代 三十、同步迭代 原文&#xff1a;exploringjs.com/impatient-js/ch_sync-iteration.htm…

SRC实战 | EDU通用漏洞分享

又是没事干的一天&#xff0c;写一下之前挖的两个通用漏洞。 1.信息搜集 首先就是信息搜集&#xff0c;挖edu没账号怎么办呢&#xff1f;sg不行&#xff0c;咱就找能自己注册的站。 Hunter&#xff1a;web.title”XX大学”&&web.body”注册” Fofa&#xff1a;host”…

11-数组-二维区域和检索 - 矩阵不可变

这是数组的第11篇算法&#xff0c;力扣链接。 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMa…

低代码开发中的Nacos配置:跨平台跳转的解决方案

在当今低代码开发的时代&#xff0c;平台的易用性和灵活性非常重要。右上角平台跳转作为用户界面中常见的交互元素&#xff0c;对于提高用户体验具有举足轻重的地位。然而&#xff0c;有时候我们会遇到跳转失效的情况&#xff0c;这无疑给用户带来了困扰。本文以JVS低代码平台为…

谷歌 2024 新年目标曝光:一边做地表最强 AI,一边裁更多员工丨 RTE 开发者日报 Vol.132

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

【软考中级】3天擦线过软考中级-软件设计师

前提&#xff1a;已有数据结构、操作系统、计算机网络、数据库基础 &#xff08;风险系数较高&#xff0c;请谨慎参考&#xff09; 贴一个成绩单hhhh 弯路&#xff1a;很早之前有看过一遍网上的软考课程&#xff0c;也记录了一些笔记&#xff0c;然而听完还是啥都记不住。 推…

【Linux工具篇】软件包管理器yum

目录 什么是软件包 什么是yum Linux系统的生态 yum的相关操作 如何搜索软件 如何安装软件 如何卸载软件 关于rzsz rz&window->Linux sz&Linux->windows wget&scp&Linux<->Linux yum本地配置 如何配置&#xff1f; 有趣好玩的Linux …

移动开发行业——鸿蒙OS NEXT开出繁花

1月18日&#xff0c;华为宣布HarmonyOS NEXT开发者预览版开放申请&#xff0c;根据官方注解&#xff0c;这个版本的鸿蒙系统有个更通俗易懂的名字——“星河版”&#xff0c;也被称为“纯血”鸿蒙。 根据官方解释&#xff0c;之所以取名星河版&#xff0c;寓意鸿蒙OS NEXT就像…

拉脱维亚市场开发攻略,带你走进“波罗的海之珠”

拉脱维亚是东欧的一个发达资本主义国家&#xff0c;也是欧盟成员国&#xff0c;是一个开放型经济体&#xff0c;经济增长率也是在欧盟排前列。中国是拉脱维亚除了欧盟以外第二大贸易国&#xff0c;拉脱维亚经济发达&#xff0c;市场稳定&#xff0c;市场潜力还是非常不错的&…

IP地址和端口

1. IP地址&#xff1a; 简介&#xff1a; IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中&#xff0c;它是能使连接到网上的所 有计算机网络实现相互通信的一套规则&#xff0c;规定了计算机在因特网上进行通信时应当遵守的规则。任 何厂家生产的计算机系统…

MySQL学习(1):centos7安装MySQL

1.安装自己系统对应的MySQL版本 1.1查看自己系统的内核版本 cat /etc/redhat-release 可以看到我的系统版本是centos7.6 1.2去官网下载对应的MySQL安装文件 MySQL官网&#xff1a; https://dev.mysql.com/downloads/ 点击MYSQL Community Server 然后可以在索引的位置选…

VSCode插件 —— Cody AI (免费AI助手!)

之前介绍过一款 阿里云免费的AI开发工具——通义灵码 TONGYI Lingma 本文再推荐一个可以极大提高开发前端开发效率的工具 —— Cody AI &#xff08;Sourcegraph&#xff09;&#xff0c;同样是免费的&#xff01; 不过&#xff0c;使用Cody AI需要有github 或 Google 、 git…

全国各城市绿地及绿化面积数据,shp/excel格式,2020-2022年

基本信息. 数据名称: 全国各城市绿地及绿化面积数据 数据格式: Shp、excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名称4city_dm城市…

Unity 适配器模式(实例详解)

文章目录 简介1. **Input Adapter 示例**2. **Component Adapter 示例**3. **网络数据解析适配器**4. **物理引擎适配**5. **跨平台服务适配** 简介 Unity中的适配器模式&#xff08;Adapter Pattern&#xff09;主要用于将一个类的接口转换为另一个接口&#xff0c;以便于原本…