포스트

[C++] tuple 사용하기

C++ 11에서 추가된 tuple 은 pair 보다 더 많은 데이터 타입을 담을 수 있습니다.


pair 의 한계

예를들어 그래프 탐색을 노드 번호가 아닌 2차원 배열의 행렬에서 실행하려고 할 때,
행과 열 번호 그리고 현재 경로의 평가 값까지 pair 로 구성한다면 아래와 같이 작성해야 합니다.

1
2
3
4
5
6
7
8
9
10
priority_queue<pair<int, pair<int, int>> pq;
pq.push(make_pair(0, make_pair(start_row, start_col)));

while(false == pq.empty()) {
    pq.front().second.first;  // current row
    pq.front().second.second; // current col
    pq.front().first;         // currnet cost

    //...
}

이처럼 pair 가 항상 2개씩 묶여야 한다는 큐칙 때문에 이름이 명확하지 않아 가독성이 떨어질 수 있습니다.
이 문제점을 개선하는 방법으로 tuple 을 사용할 수 있습니다.


3개 이상의 자료형 묶기

tuple 은 pair 보다 더 많은 자료형을 묶을 수 있습니다.
tuple 의 기본 형식은 아래와 같습니다.

1
2
3
4
5
6
7
// tuple</*여러 데이터 타입들*/> /*변수명*/;
tuple<double, char, string> student = make_tuple(3.8, 'A', "Lisa Simpson");

// tuple 데이터 가져오기
double GPA = get<0>(student);
char grade = get<1>(student);
string name = get<2>(student);

tuple 을 사용하기 위해 초기화하는 방법은
make_tuple 함수로 tuple 을 만들거나 대입 연산자를 활용해 초기화하는 방법도 있습니다.

값 대입 후 사용하기 위해 접근하는 방법은
get<데이터 타입="">(tuple 변수명) 혹은 get(tuple 변수명) 를 사용해 데이터에 접근할 수 있습니다.


tuple 활용 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
tuple<double, char, string> get_student(int id)
{
    switch (id)
    {
        case 0: return make_tuple(3.8, 'A', "Lisa Simpson");
        case 1: return {2.9, 'C', "Milhouse Van Houten"};
        case 2: return {1.7, 'D', "Ralph Wiggum"};
        case 3: return {0.6, 'F', "Bart Simpson"};
    }
 
    throw invalid_argument("id");
}

int main()
{
    // C++17 structured binding:
    const auto [gpa3, grade3, name3] = get_student(3);
    cout << "ID: 3, "
         << "GPA: " << gpa3 << ", "
         << "grade: " << grade3 << ", "
         << "name: " << name3 << '\n';

    /* 
    // get 을 사용한 데이터 접근 방법
    
    const auto student0 = get_student(0);
    cout << "ID: 0, "
         << "GPA: " << get<0>(student0) << ", "
         << "grade: " << get<1>(student0) << ", "
         << "name: " << get<2>(student0) << '\n';
 
    const auto student1 = get_student(1);
    cout << "ID: 1, "
         << "GPA: " << get<double>(student1) << ", "
         << "grade: " << get<char>(student1) << ", "
         << "name: " << get<string>(student1) << '\n';
    
    */
}

결과


참고

C++ 레퍼런스 tuple 소개 페이지

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.