pair(페어)는 독립적으로 쓰이는 일은 거의 없지만 map과 multimap의 구현에도 사용되고, 다른 컨테이너와 컨테이너 어댑터의 자료형으로도 자주 쓰이는 STL의 한 종류이다. pair 구조체(클래스가 아님)는 헤더파일 <bits/stl_pair.h>에 정의되어 있고 <pair>와 같은 헤더파일은 따로 존재하지 않는다.
pair 구조체 템플릿은 두 개의 멤버변수 first와 second를 갖는데, 각각의 타입은 _T1과 _T2(각각 first_type과 second_type으로 재정의되어 있다)이다. pair의 정렬 기준은 first, second 멤버변수의 순서로 비교하는 것이다. 처음에 두 pair의 first 멤버변수를 비교하고, 만약 first 멤버변수로 대소 여부를 결정할 수 없다면 second 멤버변수를 비교한다. 여기서도 대소 여부를 결정할 수 없다면 정렬 함수는 두 pair가 그 정렬 기준 상으로 같은 것으로 간주한다.
pair의 선언과 대입은 다음과 같이 할 수 있다.
------------------------------------------------------------
#import<bits/stdc++.h>
using namespace std;
int main()
{
pair<int, int>p;
p.first = 1;
p.second = 2;
cout << p.first << ' ' << p.second << endl;
p = make_pair(3, 4);
cout << p.first << ' ' << p.second << endl;
p={5, 6};
cout << p.first << ' ' << p.second << endl;
}
------------------------------------------------------------
Output
1 2
3 4
5 6
------------------------------------------------------------
상황에 맞게 편한 방법을 쓰면 된다.
tuple(튜플)은 pair와 비슷하지만 세 개 이상의 값을 묶어서 저장할 수 있다. C++11 표준이며 <tuple> 헤더파일을 인클루드하면 tuple을 사용할 수 있다. tuple 클래스는 <tuple> 헤더에 정의되어 있고, <bits/stl_tuple.h>와 같은 헤더파일은 따로 존재하지 않는다.
tuple의 선언과 대입은 다음과 같이 할 수 있다.
------------------------------------------------------------------------------
#import<bits/stdc++.h>
using namespace std;
int main()
{
tuple<int, int, int>a;
a = make_tuple(1, 2, 3);
cout << get<0>(a) << ' ' << get<1>(a) << ' ' << get<2>(a) << endl;
tuple<int, int, int>b(4, 5, 6);
cout << get<0>(b) << ' ' << get<1>(b) << ' ' << get<2>(b) << endl;
int x1 = 7, x2 = 8, x3 = 9;
tuple<int, int, int>c = tie(x1, x2, x3);
cout << get<0>(c) << ' ' << get<1>(c) << ' ' << get<2>(c) << endl;
}
------------------------------------------------------------------------------
Output
1 2 3
4 5 6
7 8 9
------------------------------------------------------------------------------
tuple도 pair에서 가능했던 {}를 이용한 대입이 가능하지만 컴파일러에 따라 불가능한 경우도 많기 때문에 make_tuple 등의 방법을 쓰는 것이 안전하다.
get 함수는 tuple의 원소의 값을 반환하는 함수이다. <> 안에 참조하려는 원소의 인덱스를 쓰고 () 안에는 참조하려는 tuple의 이름을 쓴다. 이때 인덱스에 변수가 들어가면 컴파일 에러가 발생한다.
tie 함수는 여러 변수들을 tuple로 묶는 함수이다. 이때 함수의 인자로 상수를 쓸 수 없다.
#import<bits/stdc++.h>
using namespace std;
int main()
{
tuple<int, int, int>a;
a = {1, 2, 3}; // Compilation Error in some cases
for(int i = 0; i < 3; i++)cout << get<i>(a) << ' '; // Compilation Error
}
pair에도 비슷한 기능을 하는 get 함수가 있는데 이 함수는 헤더파일 <utility>에 내장된 함수로 <tuple>에 내장된 함수와는 다른 함수이다.
tuple을 때때로 볼 수 있는 python과 달리 C++에서 tuple은 거의 쓸 일이 없다. 이런 것이 있다고 알아 두는 정도로도 괜찮다. 이 블로그에서는 이 글 외에 여기에 한 번 나온다.
'Algorithm > A. Intro & STL' 카테고리의 다른 글
11. Map & Multimap (0) | 2021.01.13 |
---|---|
10. Set & Multiset (0) | 2021.01.13 |
8. Priority Queue (0) | 2021.01.12 |
7. Queue (0) | 2021.01.11 |
6. Stack (0) | 2021.01.10 |