【C++ STL 模板类】pair 键值对

文章目录

  • [【 1. pair 对象的创建 】](#【 1. pair 对象的创建 】)

  • [【 2. pair 对象的赋值 】](#【 2. pair 对象的赋值 】)

  • [【 3. pair 对象的比较 】](#【 3. pair 对象的比较 】)

  • [【 4. pair对象成员的互换】](#【 4. pair对象成员的互换】)

  • C++ STL 标准库提供了 pair 类模板,专门用来将 2 个普通元素 first 和 second(可以是 C++ 基本数据类型、结构体、类自定的类型)创建成一个新元素<first, second>。

  • 头文件 <utility>

【 1. pair 对象的创建 】

  • 默认构造函数:空的 pair对象。
cpp 复制代码
// 1. 默认构造函数,即创建空的 pair 对象
pair <DataType1, DataType2> pair1;
  • 赋值构造函数:传入参数赋值。
cpp 复制代码
// 2. 直接使用 2 个元素初始化成 pair 对象
pair <DataType1, DataType2> pair2(DataType1_Value, DataType2_Value);
  • 拷贝构造函数:利用已有对象赋值。
cpp 复制代码
// 3. 拷贝构造函数:即借助另一个 pair 对象,创建新的 pair 对象
pair <DataType1, DataType2> pair3(pair2);
  • 移动构造函数(C++ 11 标准新增)
    在创建 pair4 对象时,调用了 make_pair() 函数 ,它也是 <utility> 头文件提供的,其功能是 生成一个 pair 对象。因此,当我们将 make_pair() 函数的返回值(是一个临时对象,这个临时对象是右值,意味着它是一个临时存在的、不可修改的对象)作为参数传递给 pair() 构造函数时,其调用的是移动构造函数,而不是拷贝构造函数。
cpp 复制代码
// 4. 移动构造函数
pair <DataType1, DataType2> pair4 (make_pair(DataType1_Value, DataType2_Value));
//或:
pair <DataType1, DataType2> pair4 = make_pair(DataType1_Value, DataType2_Value);
  • 右值引用构造函数(C++11 标准新增)
cpp 复制代码
// 5. 使用右值引用参数,创建 pair 对象
pair <DataType1, DataType2> pair5(DataType1(DataType1_Value), DataType2(DataType2_Value));
  • 不常用的构造函数(C++11 标准新增)
cpp 复制代码
// 6. (不常用)
pair (piecewise_construct_t pwc, tuple<Args1...> first_args, tuple<Args2...> second_args);
  • 实例
cpp 复制代码
#include <iostream>
//#include <utility>
#include <string>
using namespace std;
int main() {
    // 调用构造函数 1,也就是默认构造函数
    pair <string, int> pair1;

    // 调用第 2 种构造函数
    pair <string, string> pair2("baidu", "http://www.baidu.com");
    
    // 调用拷贝构造函数
    pair <string, string> pair3(pair2);
    
    //调用移动构造函数
    pair <string, string> pair4(make_pair("baidu", "http://www.baidu.com"));
//或:
// pair <string, string> pair4 = make_pair("baidu", "http://www.baidu.com");
    
    // 调用第 5 种构造函数
    pair <string, string> pair5(string("baidu"), string("http://www.baidu.com"));

    cout << "pair1: " << pair1.first << " " << pair1.second << endl;
    cout << "pair2: " << pair2.first << " " << pair2.second << endl;
    cout << "pair3: " << pair3.first << " " << pair3.second << endl;
    cout << "pair4: " << pair4.first << " " << pair4.second << endl;
    cout << "pair5: " << pair5.first << " " << pair5.second << endl;
    return 0;
}

【 2. pair 对象的赋值 】

  • 手动为 pair 对象赋值
cpp 复制代码
pair1.first = "baidu";
pair1.second = 34;

【 3. pair 对象的比较 】

  • 注意:对于 进行比较的 2 个 pair 对象,其对应的键和值的类型必须相同,否则将没有可比性 同时 编译器提示没有相匹配的运算符,即找不到合适的重载运算符。
  • <utility> 头文件中除了提供创建 pair 对象的方法之外,还为 pair 对象重载了 <、<=、>、>=、==、!= 这 6 种运算符 ,其运算规则是:对于进行比较的 2 个 pair 对象,先比较 pair.first 元素的大小,如果相等则继续比较 pair.second 元素的大小
  • 实例
cpp 复制代码
#include <iostream>
#include <utility>      // pair
#include <string>       // string
using namespace std;
int main() {
    pair <string, int> pair1("STL教程", 20);
    pair <string, int> pair2("C++教程", 20);
    pair <string, int> pair3("C++教程", 30);
    //pair1和pair2的key不同,value相同
    if (pair1 != pair2) {
        cout << "pair != pair2" << endl;
    }
    //pair2和pair3的key相同,value不同
    if (pair2 != pair3) {
        cout << "pair2 != pair3" << endl;
    }
    return 0;
}

【 4. pair对象成员的互换】

  • pair类模板还提供有一个 swap() 成员函数 ,能够 互换 2 个 pair 对象的键值对 ,其操作成功的 前提是这 2 个 pair 对象的键和值的类型要相同
  • 实例
cpp 复制代码
#include <iostream>
#include <utility>
#include <string>
using namespace std;
int main() {
    pair <string, int> pair1("pair", 10);                   
    pair <string, int> pair2("pair2", 20);
    
    //交换 pair1 和 pair2 的键值对
    pair1.swap(pair2);
    cout << "pair1: " << pair1.first << " " << pair1.second << endl;
    cout << "pair2: " << pair2.first << " " << pair2.second << endl;
    return 0;
}
相关推荐
Smile丶凉轩2 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
small_wh1te_coder4 小时前
从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考
c语言·数据结构·c++·stm32·算法·leetcode·深度优先
hjjdebug6 小时前
constexpr 关键字的意义(入门)
c++·constexpr
虾球xz7 小时前
游戏引擎学习第282天:Z轴移动与摄像机运动
c++·学习·游戏引擎
.小墨迹7 小时前
Apollo学习——planning模块(3)之planning_base
linux·开发语言·c++·学习·自动驾驶
龙湾开发8 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(一)过程式凹凸贴图
c++·笔记·学习·3d·图形渲染
德亦周8 小时前
如何在Mac电脑上的VScode去配置C/C++环境
c++·vscode·macos
XiaoyaoCarter8 小时前
每日一道leetcode(新学数据结构版)
数据结构·c++·算法·leetcode·职场和发展·哈希算法·前缀树
八月的雨季 最後的冰吻8 小时前
SIP协议栈--osip源码梳理
linux·服务器·网络·c++·网络协议
fancy1661669 小时前
搜索二维矩阵 II
c++·算法·矩阵