• 【C++进阶】pair容器


    在这里插入图片描述

    👦个人主页:@Weraphael
    ✍🏻作者简介:目前学习C++和算法
    ✈️专栏:C++航路
    🐋 希望大家多多支持,咱一起进步!😁
    如果文章对你有帮助的话
    欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


    一、什么是pair

    假设我想打包两种数据,第一个是学生的姓名,第二个是学生的学号,我们就可以写出如下结构体:

    #include 
    
    struct Student
    {
    	std::string _name; // 名字
    	int _id; // 学号
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    像这样只打包两种数据,我们就可以使用std::pairpair的中文意思一对,也就是说它只能保存一对数据

    在这里插入图片描述

    pair是C++已经定义好的结构体,同时也是一个类模板,并且使用前需要加上头文件

    【pair部分源码】

    template <class T1, class T2>
    struct pair
    {
    	typedef T1 first_type;
    	typedef T2 second_type;
    	
    	T1 first;
    	T2 second;
    	pair(): first(T1()), second(T2())
    	{}
    	pair(const T1& a, const T2& b): first(a), second(b)
    	{}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    通过以上源码我们发现:pair有两个公有成员变量,分别是:firstsecond。并且它们可以直接在类外被使用。

    【声明方式】

    类模板实例化对象需要加上<>

    std::pair<第一个数据类型,第二个数据类型> 变量名
    
    • 1

    接下来我用代码演示 一下刚才的学生结构体

    #include 
    #include 
    #include 
    
    int main()
    {
        // 第一个数据类型为string,表示学生的姓名
        // 第二个数据类型为int,表示学生的学号
        std::pair<std::string, int> stu;
    
        stu.first = "Weraphael";
        stu.second = 2022;
    
        std::cout << "姓名:" << stu.first << std::endl;
        std::cout << "学号:" << stu.second << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    【运行结果】

    在这里插入图片描述

    二、pair的初始化

    在这里插入图片描述

    pair常见的初始化是以上第一种和第二种,分别是默认构造和拷贝构造

    • 注意:如果使用默认构造函数初始化,其成员变量firstsecond的值是0(如果是string就是空字符串)

    在这里插入图片描述

    • 除此之外,还有第三种初始化方式
    std::pair<类型1, 类型2> 变量名(第一个数据的初始值, 第二个数据的初始值);
    // 对应的类型一定要匹配!!!
    
    • 1
    • 2

    【代码演示】

    #include 
    #include 
    #include 
    
    int main()
    {
        std::pair<std::string, int> p("Weraphael", 18);
    
        std::cout << "姓名:" << p.first << std::endl;
        std::cout << "年龄:" << p.second << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    【程序结果】

    在这里插入图片描述

    三、pair的大小比较

    它们的比较顺序是这样的:首先先比较first成员变量,如果相等就会比较second

    在这里插入图片描述

    注意:pair内部成员的类型不一样的两个对象不能比较大小!!!

    在这里插入图片描述

    【代码验证】

    pair内部已经实现过比较大小运算符重载了

    在这里插入图片描述

    #include 
    #include 
    #include 
    
    int main()
    {
        std::pair<int, std::string> p1(18, "Weraphael");
        std::pair<int, std::string> p2(19, "Weraphael");
    
        std::cout << "p1是否小于p2:" << (p1 < p2) << std::endl;
    
        std::pair<int, std::string> p3(18, "zhangsan");
        std::cout << "p1是否小于p3:" << (p1 < p3) << std::endl;
    
        std::pair<int, std::string> p4(18, "Weraphael");
        std::cout << "p1是否等于p4:" << (p1 == p4) << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    【运行结果】

    在这里插入图片描述

    四、make_pair函数

    在这里插入图片描述

    功能:make_pair函数接收两个参数,然后它会将这两个参数来创建pair对象

    【代码样例】

    #include 
    #include 
    #include 
    
    int main()
    {
        std::pair<int, int> p = std::make_pair(1, 2);
    
        std::cout << "first:" << p.first << std::endl;
        std::cout << "second:" << p.second << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    【程序结果】

    在这里插入图片描述

    以上我们发现:用了make_pair函数后,代码变长了。但是实际上,make_pair函数是用来简化代码的

    从C++到C++17,结构体创建对象的代码一直都在简化。我们可以看C++98是如何简化pair创建对象的代码的:

    • 有两个long long类型的变量,现需要通过一个打印函数,将这两个变量打包成pair后再打印

    如果不使用make_pair函数,就会写出以下代码

    #include 
    #include 
    
    void Print(std::pair<long long, long long> p)
    {
        std::cout << "first:" << p.first << std::endl;
        std::cout << "second:" << p.second << std::endl;
    }
    
    int main()
    {
        long long a = 1;
        long long b = 2;
    
        Print(std::pair<long long, long long>(a, b));
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    【运行结果】

    在这里插入图片描述

    但是用了make_pair函数后,以上代码就会简化很多

    #include 
    #include 
    
    void Print(std::pair<long long, long long> p)
    {
        std::cout << "first:" << p.first << std::endl;
        std::cout << "second:" << p.second << std::endl;
    }
    
    int main()
    {
        long long a = 1;
        long long b = 2;
    
        Print(std::make_pair(a, b));
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    【运行结果】

    在这里插入图片描述


    注:以上知识是为了为map容器打基础!!!

  • 相关阅读:
    Python 模拟类属性
    关于构造方法
    Node.js学习-11模块化
    【MLT】MLT多媒体框架生产消费架构解析(一)
    JAVA电子病历系统计算机毕业设计Mybatis+系统+数据库+调试部署
    5G商企专网,助力打造城市生命线“安徽样板”
    关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章
    高速密码工程化的若干实践与思考
    新版发布 | Cloudpods v3.10.5 和 v3.9.13 正式发布
    iscsi_server_client_chap_username_password_targetcli
  • 原文地址:https://blog.csdn.net/Weraphael/article/details/134056321