Tuple(튜플)이란 여러가지 데이터 타입을 하나로 묶는 C++ 표준 라이브러리(STL)의 템플릿 클래스 중 하나이다. pair는 2가지 데이터 타입을 하나로 묶지만, Tuple은 2가지 이상의 데이터 타입을 원하는 개수만큼 묶을 수 있다.
1. 튜플 선언
#include <Tuple>
tuple<int, float, string> myTuple1(10, 3.14, "Pi");
tuple myTuple2 = make_tuple(10, 3.14, "Pi");
튜플의 생성자를 이용해 튜플을 선언하고 초기화 할 수 있다.
또한 make_tuple() 함수를 통해서도 튜플을 선언할 수 있다.
2. 튜플 원소 접근
cout<< get<0>(myTuple1); // 10
cout<< get<1>(myTuple1); // 3.14
cout<< get<2>(myTuple1); // Pi
get<>() 함수를 통해 튜플의 원소에 접근할 수 있다.
<>안에는 인덱스가 들어가고, ()에는 접근하려는 튜플의 이름이 들어간다.
auto[id, value, name] = myTuple1;
cout<< id << value << name // 10 3.14 Pi
auto&[id, value, name] = myTuple1;
id = 100;
cout<<get<0>(myTuple1); // 100
또한 auto 키워드를 통해 튜플의 각 요소들을 개별 변수로 분리할 수 있다. 이때 튜플의 각 요소들의 값은 참조가 아닌 복사되기 때문에, & 연산자를 통해 참조로 받아 수정할 수도 있다.
int x;
float y;
string s;
tie(x,y,s) = myTuple1;
cout << x << y << s // 10 3.14 Pi
tie() 함수를 통해서도 튜플의 각 요소들의 분리할 수 있다. 이때 각 요소에 맞는 데이터 타입의 변수를 선언해야 하는 점을 주의해야 한다.
3. 튜플 합치기
tuple<int, float> t1(10, 3.14);
tuple<char, string> t2('a' , "Hello");
tuple<int, float, char, string> t3 = tuple_cat(t1,t2);
auto t4 = tuple_cat(t2, t3); // tuple<char, string, int, float, char, string>
tuple_cat() 함수를 통해 튜플을 합칠 수 있다. 첫번째 인자로 오는 튜플 뒤에 그 다음 인자로 오는 튜플이 붙는다.
4. 튜플 교체
tuple<int, char> t1(1,'a');
tuple<int, char> t2(9,'z');
swap(t1,t2);
cout<<get<0>(t1); // 9
cout<<get<1>(t2); // a
swap() 함수를 통해 튜플의 값을 효율적으로 교환할 수 있다. 이때 교환하려는 두 튜플의 데이터 타입은 모두 같아야 한다.
5. 튜플 비교 연산자
튜플을 기본적으로 < , <= , != , == 등의 비교 연산자를 지원한다.
0번 인덱스부터 차례대로 비교하고, 0번 인덱스가 다르면 그 비교값이 전체 튜플을 비교한 결과가 된다. 만약 같다면 1번 인덱스로 넘어가서 비교한다.
튜플은 3가지 이상의 데이터 타입을 한번에 묶어서 관리해야 하는 경우 사용할 수 있다.
함수에서 여러 가지의 값을 한번에 반환해야 할 때 튜플을 사용할 수 있다.
또한 map, set 등에서 여러 가지 값을 조합하여 하나의 키로 사용해야 할 때 튜플을 사용할 수 있다.