首页 / 第十一章 · STL 标准模板库 / 11.11 pair

11.11 pair 打包两个值

把两个值"绑"在一起当做一个整体——比如坐标 (x, y)、名字和分数 ("Alice", 85)。

本页目录

pair 可以把两个值"绑"在一起当做一个整体。比如坐标 (x, y)、名字和分数 ("Alice", 85)。使用前需引入 <utility> 头文件(不过 <map><vector> 等头文件通常已经间接包含了它,很多时候不需要单独引入)。

pair<string, int> p = {"Alice", 85};两个不同类型的值打包成一个整体
"Alice"
85
p.first
p.second
两个值的类型可以不同(这里是 string 和 int),但一旦定义好类型就固定了,不能再换。通过 .first.second 分别访问。
11.11.1 定义与初始化
C++ · pair 的几种创建方式
1#include <iostream>
2#include <utility> // pair 在这里——或者不引入也可以,<map>、<vector> 等头文件通常已经包含了它
3using namespace std;
4
5int main()
6{
7 pair<string, int> p1 = {"Alice", 85};
8 pair<int, int> p2 = {3, 4}; // 坐标
9
10 // 用 make_pair 创建(编译器自动推导类型)
11 auto p3 = make_pair("Bob", 92);
12
13 return 0;
14}
11.11.2 常用操作

🔍 访问与比较

C++ · first / second 访问,以及字典序比较
1pair<string, int> p1 = {"Alice", 85};
2pair<int, int> p2 = {3, 4}; // 坐标
3
4// 访问
5cout << p1.first << ": " << p1.second << endl; // Alice: 85
6cout << "x=" << p2.first << ", y=" << p2.second << endl; // x=3, y=4
7
8// 比较:先比 first,first 相等再比 second
9pair<int, int> a = {1, 5}, b = {1, 3};
10cout << (a > b); // 输出:1(true),因为 5 > 3
11
12// C++17 结构化绑定(更直观)
13auto [name, score] = p1; // name = "Alice", score = 85
💡
pair 的默认比较规则:先比 firstfirst 相等时再比 second这个特性在竞赛中很常用——比如把 vector<pair<int,int>> 直接 sort(),不用写自定义比较函数,默认就是"先按第一个值排序,相同再按第二个值排序"。
📌
结构化绑定(C++17):auto [name, score] = p1;p1.first / p1.second 更直观,尤其是配合范围 for 遍历 map 时:for (auto& [key, val] : m)p.first / p.second 可读性好得多。
11.11.3 完整使用示例
C++ · pair 综合示例
1#include <iostream>
2#include <utility>
3// 或者不引入也可以,<map>、<vector> 等头文件通常已经包含了它
4using namespace std;
5
6int main()
7{
8 pair<string, int> p1 = {"Alice", 85};
9 pair<int, int> p2 = {3, 4}; // 坐标
10
11 // 访问
12 cout << p1.first << ": " << p1.second << endl; // Alice: 85
13 cout << "x=" << p2.first << ", y=" << p2.second << endl; // x=3, y=4
14
15 // 用 make_pair 创建
16 auto p3 = make_pair("Bob", 92);
17
18 // 比较:先比 first,再比 second
19 pair<int, int> a = {1, 5}, b = {1, 3};
20 cout << (a > b) << endl; // 输出:1(true),因为 5 > 3
21
22 // C++17 结构化绑定
23 auto [name, score] = p1;
24 cout << name << " scored " << score << endl; // Alice scored 85
25
26 return 0;
27}
📋 pair 常用操作速查表

把本节出现过的方法按用途归类汇总,写代码时可以直接当参考卡用。

方法 / 写法分类作用
pair<T1, T2> p = {a, b}定义定义并初始化一个 pair
make_pair(a, b)定义自动推导类型创建 pair
p.first / p.second访问访问第一个 / 第二个值
== / != / < / >比较先比 first,相等再比 second
auto [a, b] = p访问C++17 结构化绑定,更直观
🎯
什么时候用 pair?需要临时打包两个相关的值时:函数要返回两个结果、坐标点、边的两个端点(图论里常见 pair<int,int> 表示一条边)、需要按"主次双关键字"排序的数据等。如果要打包三个以上的值,看下一章的结构体或 C++11 的 tuple