【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.rhkb.cn/news/243748.html

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

相关文章

CmakeList教程

一、CmakeList介绍&#xff1a; cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。它会通过写的语句自动生成一个MakeFile,从而实现高效编译 二、CmakeList的常用指令 1.指定…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电&#xff0c;基带电源也叫pmu。 首先时序图说电池提供供电&#xff0c;电池是J6接口&#xff0c;视频习惯把接口称之为座子。查U2_RF芯片&#xff0c;发现供电信号为PP_BATT_VCC_CONN&#xff0c;但是没查到跟电池座子有关系&#xff0c;电池座子写的是…

回溯算法篇-01:全排列

力扣46&#xff1a;全排列 题目分析 这道题属于上一篇——“回溯算法解题框架与思路”中的 “元素不重复不可复用” 那一类中的 排列类问题。 我们来回顾一下当时是怎么说的&#xff1a; 排列和组合的区别在于&#xff0c;排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不…

电脑磁盘格式化了怎么恢复里面文件?多个方法任你选

在日常生活中&#xff0c;我们可能会遇到由于误操作、病毒攻击等原因导致电脑磁盘被格式化的情况。一旦发生这种情况&#xff0c;我们可能会失去重要的文件&#xff0c;给工作和生活带来很大的困扰。但是&#xff0c;不必过于担心&#xff0c;本文将为您详细介绍如何在电脑磁盘…

Python 什么是点积注意力机制;点击注意力机制代码实现;Dot-Product Attention代码实战;超详细代码实现点积注意力

1.点积注意力机制简介 点积注意力机制&#xff08;Dot-Product Attention&#xff09;是一种常用的注意力机制之一&#xff0c;通常与Seq2Seq模型中的自注意力&#xff08;Self-Attention&#xff09;机制一起使用。它用于计算查询&#xff08;Query&#xff09;和键&#xff0…

Buildroot显示uboot logo

根据之前的开机现象&#xff0c;uboot部分没有开机logo 1、Makefile配置 查看一下u-boot/tools/Makefile是否都有如下配置 # Enable all the config-independent tools ifneq ($(HOST_TOOLS_ALL),) CONFIG_LCD_LOGO y CONFIG_CMD_LOADS y CONFIG_CMD_NET y CONFIG_XWAY_SW…

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件&#xff1a; 软件&#xff1a; 操作系统&#xff1a; 操作系统工作流程 操作系统作用 常见的操作系统 PC端&#xff1a; 移动端&#xff1a;&#xff08;掌上操作系统&#xff09; 一.初识Linux 2.Linux初识 linu…

分布式websocket即时通信(IM)系统保证消息可靠性【第八期】

b站上面本期视频版本&#xff0c;观看视频食用更佳&#xff01;点击即可跳转,找不到视频可以直接搜索我 目前叫 呆呆呆呆梦 目前已经写的文章有。并且有对应视频版本。 git项目地址 【IM即时通信系统&#xff08;企聊聊&#xff09;】点击可跳转 sprinboot单体项目升级成sprin…

Ubuntu用gparted重新分配空间

ubuntu系统使用过程中安装系统时预先留的空间不够使用怎么办&#xff1f; 这么办&#xff01; 首先 使用df -h 查看当前空间使用情况 已经分配的空间重新规划 &#xff1f; 先将已分配的空间中的多余空间分离出来&#xff1b; 假设我想将挂载点/home下的一部分空间分给挂载…

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…

matlab模型变量一般说明,标定和显示量,以及产生a2l文件,自动填充a2l地址,并使用标定工具ati进行标定(推荐重要)

注意我是用的是matlab2019b 1&#xff0c;输入标定量&#xff0c;使用constant&#xff0c;用cal函数包裹 2&#xff0c;输出显示量&#xff0c;在划线上标注&#xff0c;然后用display函数包裹&#xff0c; 第一步和第二步完成以后&#xff0c;生产标定量a2l 3&#xff0c;输入…

常规二分查找中遇到的问题

以前我们写二分查找的时候&#xff0c;是这么写的&#xff1a; public static int binarySearch2(int []a,int target){int i0,ja.length-1;while(i<j){int mid(ij)/2;if(a[mid]target){return mid;}else if(a[mid]<target){imid1;}else {jmid-1;}}return -1;} 这么写&…

conda环境下OSError: We couldn‘t connect to ‘https://huggingface.co‘问题解决

1 问题描述 (dreamtalk) [rootlocalhost dreamtalk]# python inference_for_demo_video.py --wav_path data/audio/acknowledgement_english.m4a --style_clip_path data/style_clip/3DMM/M030_front_neutral_level1_001.mat --pose_path data/pose/RichardShelby_front_neutr…

【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

探索Tomcat技术架构设计模式的奥秘 Tomcat系统架构分析Tomcat 整体结构Tomcat总体结构图以 Service 作为“婚姻”1) Service 接口方法列表 2) StandardService 的类结构图方法列表 3) StandardService. SetContainer4) StandardService. addConnector 以 Server 为“居”1) Ser…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

OpenCV——Scharr边缘检测

目录 一、Scharr算法1、算法概述2、主要函数 二、C代码三、python代码四、结果展示1、灰度图2、X方向一阶边缘2、Y方向一阶边缘3、整幅图像的一阶边缘 五、相关链接 OpenCV——Scharr边缘检测由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&…

MODNet 剪枝再思考: 优化计算量的实验历程分享

目录 1 写在前面 2 模型分析 3 遇到问题 4 探索实验一 4.1 第一部分 4.2 第二部分 Error 1 Error 2 4.3 实验结果 ①参数量与计算量 ②模型大小 ③推理时延 5 探索实验二 5.1 LR Branch 5.2 HR Branch 5.2.1 初步分析 5.2.2 第一部分 enc2x 5.2.3 第二部分 en…

【算法分析与设计】二叉树的层序遍历

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xf…

2017年认证杯SPSSPRO杯数学建模B题(第二阶段)岁月的印记全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 B题 岁月的印记 原题再现&#xff1a; 对同一个人来说&#xff0c;如果没有过改变面容的疾病、面部外伤或外科手术等经历&#xff0c;年轻和年老时的面容总有很大的相似性。人们在生活中也往往能够分辨出来两张不同年龄段的照片是不是同一个人…

3D应用开发工具HOOPS引领数字化工厂浪潮:制造业转型的关键角色!

随着科技的迅猛发展&#xff0c;制造业正经历着数字化转型的浪潮。在这一变革的前沿&#xff0c;Tech Soft 3D 的 HOOPS技术正扮演着关键的角色。 本文将深入研究HOOPS技术如何在数字化工作流程中发挥作用&#xff0c;以及它是如何引领制造业朝着更高效、智能的未来迈进的。 …