[C++] STL 자료구조: Pair, Tuple
pair, tuple은 여러 개의 자료형을 묶어서 관리할 수 있게 해주는 편리한 자료형이다.
보통 2개의 자료형을 함께 다뤄야하면 pair를, 3개 이상을 다뤄야 하면 tuple을 사용한다.
##Pair
<pair> 예시 1
using pii = pair<int, int>; //자주 사용하는 조합은 별칭으로 생성해도 된다.
int main() {
fastio;
pii a; // a = { 0, 0 }
pii b(1, 2); // b = { 1, 2 }; 2개가 쌍으로
pair<string, double> c{ "HI", 3.14 }; // c = { "HI", 3.14 }
cout << a.first << ' ' << b.second << '\n';
cout << c.first << ' ' << c.second << '\n';
vector<pii> v;
v.push_back(a);
v.push_back({ 3, 4 });
v.push_back(make_pair(5, 6));
for (const auto& [a, b] : v)
cout << a << ' ' << b << '\n';
// 하면
0 0
3 4
5 6 이 출력된다. }
<pair> 예시 2 : C++17부터 도입된 구조화된 바인딩
using pii = pair<int, int>;
int main() {
fastio;
pii p={1,2};
auto& [a,b] = p;
a=3; b+=a;
cout<<p.first<<' '<<p.second<<'\n';
} 하면 3 5 출력된다.
p 객체를 참조하여 그 요소를 a와 b에 각각 바인딩합니다. 그러면 p의 첫 번째 요소가 a에 바인딩되고, 두 번째 요소가 b에 바인딩된다
<pair> 예시 3: 비교 연산자
using pii = pair<int, int>;
int main() {
fastio;
pii a = { 4, 2 };
pii b = { 1, 3 };
cout << (a < b) << '\n'; // 0
cout << (a > b) << '\n'; // 1
}
pair에는 비교 연산자가 정의되어 있다.
정렬 기준은 first를 먼저 비교하고, first가 같다면 second를 비교한다.
예를 들어 { 4, 2 }, { 1, 3 }은 first가 다르기 때문에 4와 1을 비교하고, { 4, 2 }, { 4, 3 }은 2와 3을 비교한다.
##Tuple
using tii = tuple<int, int, int>;
int main() {
fastio;
tii a; // a = { 0, 0, 0 }
tii b(1, 2, 3); // b = { 1, 2, 3 }
tuple<int, double, string> c = { 123, 3.14, "HI" }; // c = { 123, 3.14, "HI" }
cout << get<0>(a) << ' ' << get<1>(b) << ' ' << get<2>(c) << '\n'; // 0 2 HI
vector<tii> v;
v.push_back(a);
v.push_back({ 1, 2, 3 });
v.push_back(make_tuple(4, 5, 6));
for (const auto& [a, b, c] : v) cout << a << ' ' << b << ' ' << c << '\n'; }
//하면
0 2 HI
0 0 0
1 2 3
4 5 6 출력된다.
tuple은 pair와 비슷한 자료형으로 임의 개수의 인자를 받아올 수 있다.
차이점은 first, second가 없어서 0, 1, 2, ...i번째 값에 접근할 때 get<i>(a)와 같이 사용해야 하거나 const auto& [t1, t2, t3] = a와 같이 구조적 바인딩을 사용할 수 있다.
(원래 값의 수정이 필요하면 auto&로, 원래 값과 별개로 사용하고싶다면 auto로 받아오면 된다)
tuple도 마찬가지로 비교 연산자가 정의되어있어서 앞에서부터 차례대로 대소 관계를 확인한다.
pair는 나중에 다익스트라에서 우선순위 큐에 { dist[u], u }를 저장하기 위해 자주 사용된다.