pair 的意思是數對,顧名思義就是將兩個資料組在一起。pair 只能儲存兩個數值,不可多也不可少,這種資料結構常常用來儲存平面上的座標或是兩筆有關聯的資料。而且 pair 還可以同時儲存兩個不同型態的資料。
初始化#
pair 作為 std 中的一員,在使用前需要引入 <utility> 才能使用,當然如果你已經引入 <bits/stdc++.h> 就不需要再引入了。
#include <utility>
舉例來說我們要儲存一位學生的資料,分別為其名稱與對應的座號,就可以在 pair 的第一格放上名稱、第二格放上座號。
這邊介紹兩種宣告和初始化的方法:
pair<string, int> p1; // 宣告但未初始化
pair<string, int> p2("YD", 14); // 宣告並初始化
存取與修改#
pair 中有兩個儲存位置,分別是 first 與 second 。在上面的例子中,姓名儲存在前面也就對應著 first ,座號則對應 second ,我們可以透過 . 來存取或修改這兩個位置:
cout << p.first << endl; // YD
cout << p.second << endl; // 14
p.first = "Dio";
p.second = 15;
cout << p.first << endl; // Dio
cout << p.second << endl; // 15
如果需要話,也可以把整個 pair 都修改掉,這邊要用到 make_pair 函式:
pair<string, int> p;
p = make_pair("YD", 14);
cout << p.first << endl; // YD
cout << p.second << endl; // 14
p = make_pair("Dio", 15);
cout << p.first << endl; // Dio
cout << p.second << endl; // 15
如果你的覺得寫 make_pair 太麻煩,也可以直接用 {} 來代替 make_pair:
pair<string, int> p1 = {"YD", 14};
cout << p1.first << endl; // YD
cout << p1.second << endl; // 14
p1 = {"Dio", 15};
cout << p1.first << endl; // Dio
cout << p1.second << endl; // 15
注意
如果使用 {} 來初始化 pair ,則 pair 的型態必須要明確,否則有些時候會出現編譯錯誤或預期外的情況。聽起來有點抽象?沒關係,讓我們來看幾個例子!
auto p = {"YD", 14};
在這段程式碼中,auto 無法判斷 {} 中的型態,因為不只有 pair 可以透過 {} 初始化(比如陣列也可以),所以你可能會得到預期外的情況。
vector<pair<int, int>> v;
// no instance of overloaded function "find" matches the argument list
find(v.begin(), v.end(), {1, 2});
在上面那段程式碼中,find 也無法判斷 {} 中的型態,所以會出現編譯錯誤,這時候你就需要明確地告訴編譯器 {} 中的型態,比如用 make_pair 、直接寫出型態或者先宣告好 pair 在丟進 find 中。
解構 pair#
如果你想要將 pair 中的資料分別存入不同的變數中,可以使用 tie 函式,這會將 pair 中的資料解構依序塞入 tie 中的各個變數中,每個變數的型態都要與宣告時相同。以下是一個簡單的範例:
pair<int, int> p = {1, 2};
int a, b;
tie(a, b) = p;
cout << a << endl; // 1
cout << b << endl; // 2
pair 的比較#
pair 也可以進行比較,比較的方式是先比較 first ,如果 first 相同再比較 second 。如果 first 和 second 都相同,則這兩個 pair 就是相等的。以下是一個簡單的範例:
pair<int, int> p1 = {1, 2};
pair<int, int> p2 = {1, 2};
pair<int, int> p3 = {2, 1};
cout << (p1 < p2) << endl; // false
cout << (p1 < p3) << endl; // true
cout << (p1 == p2) << endl; // true
