백준일지

[C++] STL 자료구조: Pair, Tuple

민지기il 2024. 5. 9. 12:09

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 }를 저장하기 위해 자주 사용된다.