開啟章節選單
Pair
常見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
小測驗
若 pair<int, int> p = {1, 2};
、pair<int, int> q = {2, 1};
,則下列哪個表達式會回傳 true
?