Pair

常見

pair 的意思是數對,顧名思義就是將兩個資料組在一起。pair 只能儲存兩個數值,不可多也不可少,這種資料結構常常用來儲存平面上的座標或是兩筆有關聯的資料。而且 pair 還可以同時儲存兩個不同型態的資料。

初始化

pair 作為 std 中的一員,在使用前需要引入 <utility> 才能使用,當然如果你已經引入 <bits/stdc++.h> 就不需要再引入了。

#include <utility>

舉例來說我們要儲存一位學生的資料,分別為其名稱與對應的座號,就可以在 pair 的第一格放上名稱、第二格放上座號。

這邊介紹兩種宣告和初始化的方法:

pair<string, int> p1; // 宣告但未初始化
pair<string, int> p2("YD", 14); // 宣告並初始化

存取與修改

pair 中有兩個儲存位置,分別是 firstsecond 。在上面的例子中,姓名儲存在前面也就對應著 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 。如果 firstsecond 都相同,則這兩個 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

小測驗

pair<int, int> p = {1, 2};pair<int, int> q = {2, 1};,則下列哪個表達式會回傳 true