【C++学习笔记】:pair模板的简单使用

230 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

1、写在前面

大家好。今天文章的内容是:

  • pair容器

2、内容

2.1、简介

C++ STL标准库中,有一个定义在<utility>头文件中的类模板pair,可以将两个普通元素(firstsecond)封装成一个新的元素<first, second>。我们使用变量名称后跟点运算符以及关键字firstsecond,就可以访问元素的键和值。

注意,这里的普通元素的数据类型可以是基本数据类型、结构体或自定义类等。

因此,利用STL提供的类模板pair,我们可以创建“键值对”形式的序列。当我们需要将两个数据合成一个数组时或者在函数中需要返回2个数据时,就可以使用pair类模板。

2.2、构造函数

pair类模板的基本构造函数有以下三种:

  • pair(),默认构造函数,可创建空的pair对象;
  • pair (const first_type& a, const second_type& b),可使用两个元素初始化一个pair对象;
  • template<class U, class V> pair (const pair<U,V>& pr),可利用一个pair对象来创建新的pair对象。

举个例子:

#include <iostream>
#include <utility>
using namespace std;
int main() {
    pair <int, int> pair1;		// 调用默认构造函数,创建空的`pair`对象
    pair <int, int> pair2(1,111);  	// 使用两个元素初始化一个`pair`对象
    pair <int, int> pair3(pair2);	// 调用拷贝构造函数,利用一个`pair`对象来创建新的`pair`对象。
    cout << "pair1.first: " << pair1.first << " | pair1.second: " << pair1.second << endl;
    cout << "pair2.first: " << pair2.first << " | pair2.second: " << pair2.second << endl;
    cout << "pair3.first: " << pair3.first << " | pair3.second: " << pair3.second << endl;
    return 0;
}

运行结果为:

pair1.first: 0 | pair1.second: 0
pair2.first: 1 | pair2.second: 111
pair3.first: 1 | pair3.second: 111

备注,我们可以手动为空对象赋值,比如:

#include <iostream>
#include <utility>
#include <string>
using namespace std;
int main() {
    pair <string, double> pair1;  // 调用默认构造函数,创建空的`pair`对象
    pair1.first = "PI";
    pair1.second = 3.14159;
    cout << "pair1.first: " << pair1.first << endl;
	cout << "pair1.second: " << pair1.second << endl;
    return 0;
}

运行结果为:

pair1.first: PI
pair1.second: 3.14159

2.3、运算符

<utility>头文件中,pair对象还被重载了六种运算符,包括<<=>>===!=。运算规则如下:

  • 首先,对于进行比较的两个pair对象而言,必须对应的键值对的数据类型必须相同,才有可比性。
  • 其次,优先比较pair.first元素的大小;
  • 如果两个对象的pair.first元素都相等,再继续比较pair.second元素的大小。

举个例子:

#include <iostream>
#include <utility>
#include <string>
using namespace std;
int main() {
    pair <string, int> pair1("myAge", 24);
    pair <string, int> pair2("myAge", 24);
    pair <string, int> pair3("myAge", 25);
    // pair1 和 pair2的 first 和 second都相等,因此 pair1 == pair2
    if (pair1 == pair2) {
        cout << "pair1 == pair2" << endl;
    }
	else {
        cout << "pair1 != pair2" << endl;
    }
    // 虽然 pair2 和 pair3的 first 相等,但是 second 不相等,因此 pair2 != pair3
    if (pair2 == pair3) {
        cout << "pair2 == pair3" << endl;
    }
	else {
        cout << "pair2 != pair3" << endl;
    }
    return 0;
}

程序执行结果为:

pair1 == pair2
pair2 != pair3

2.4、swap()

如果两个pair对象的键值对类型相对应(相同),则可以利用swap()函数来互换这两个pair对象的键值对。

举个例子:

#include <iostream>
#include <utility>
#include <string>
using namespace std;
int main() {
	// 初始化对象 
    pair <string, int> objA("A", 0);                   
    pair <string, int> objB("B", 1);
    
    // 输出语句一
    cout << "交换前:\n";
    cout << "objA.first的值为:" << objA.first << " , " << "objA.second的值为:" << objA.second << endl;
    cout << "objB.first的值为:" << objB.first << " , " << "objB.second的值为:" << objB.second << endl;
    
    //交换 objA 和 objB 的键值对
    objA.swap(objB);
    
    // 输出语句二
    cout << "\n交换后:\n";
    cout << "objA.first的值为:" << objA.first << " , " << "objA.second的值为:" << objA.second << endl;
    cout << "objB.first的值为:" << objB.first << " , " << "objB.second的值为:" << objB.second << endl;
    
    return 0;
}

程序执行结果为:

交换前:
objA.first的值为:A , objA.second的值为:0
objB.first的值为:B , objB.second的值为:1

交换后:
objA.first的值为:B , objA.second的值为:1
objB.first的值为:A , objB.second的值为:0

3、写在最后

好了,文章的内容就记录到这里,感谢观看。