开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
1、写在前面
大家好。今天文章的内容是:
- pair容器
2、内容
2.1、简介
在C++ STL标准库中,有一个定义在<utility>头文件中的类模板pair,可以将两个普通元素(first和second)封装成一个新的元素<first, second>。我们使用变量名称后跟点运算符以及关键字first或second,就可以访问元素的键和值。
注意,这里的普通元素的数据类型可以是基本数据类型、结构体或自定义类等。
因此,利用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、写在最后
好了,文章的内容就记录到这里,感谢观看。