[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 활용 코드
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';
*/
}
참고
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.