把两个值"绑"在一起当做一个整体——比如坐标 (x, y)、名字和分数 ("Alice", 85)。
pair 可以把两个值"绑"在一起当做一个整体。比如坐标 (x, y)、名字和分数 ("Alice", 85)。使用前需引入 <utility> 头文件(不过 <map>、<vector> 等头文件通常已经间接包含了它,很多时候不需要单独引入)。
.first 和 .second 分别访问。| 1 | #include <iostream> |
| 2 | #include <utility> // pair 在这里——或者不引入也可以,<map>、<vector> 等头文件通常已经包含了它 |
| 3 | using namespace std; |
| 4 | |
| 5 | int 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 | } |
🔍 访问与比较
| 1 | pair<string, int> p1 = {"Alice", 85}; |
| 2 | pair<int, int> p2 = {3, 4}; // 坐标 |
| 3 | |
| 4 | // 访问 |
| 5 | cout << p1.first << ": " << p1.second << endl; // Alice: 85 |
| 6 | cout << "x=" << p2.first << ", y=" << p2.second << endl; // x=3, y=4 |
| 7 | |
| 8 | // 比较:先比 first,first 相等再比 second |
| 9 | pair<int, int> a = {1, 5}, b = {1, 3}; |
| 10 | cout << (a > b); // 输出:1(true),因为 5 > 3 |
| 11 | |
| 12 | // C++17 结构化绑定(更直观) |
| 13 | auto [name, score] = p1; // name = "Alice", score = 85 |
first,first 相等时再比 second。这个特性在竞赛中很常用——比如把 vector<pair<int,int>> 直接 sort(),不用写自定义比较函数,默认就是"先按第一个值排序,相同再按第二个值排序"。auto [name, score] = p1; 比 p1.first / p1.second 更直观,尤其是配合范围 for 遍历 map 时:for (auto& [key, val] : m) 比 p.first / p.second 可读性好得多。| 1 | #include <iostream> |
| 2 | #include <utility> |
| 3 | // 或者不引入也可以,<map>、<vector> 等头文件通常已经包含了它 |
| 4 | using namespace std; |
| 5 | |
| 6 | int 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<T1, T2> p = {a, b} | 定义 | 定义并初始化一个 pair |
| make_pair(a, b) | 定义 | 自动推导类型创建 pair |
| p.first / p.second | 访问 | 访问第一个 / 第二个值 |
| == / != / < / > | 比较 | 先比 first,相等再比 second |
| auto [a, b] = p | 访问 | C++17 结构化绑定,更直观 |
pair<int,int> 表示一条边)、需要按"主次双关键字"排序的数据等。如果要打包三个以上的值,看下一章的结构体或 C++11 的 tuple。