본문 바로가기

Algorithm/A. Intro & STL

9. Pair & Tuple

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