tuple 사용법
tuple은 여러 개의 원소를 저장하는 데 쓰이는 C++ 표준 라이브러리의 유틸리티 클래스입니다.
pair 같은 경우 2개의 원소만을 저장할 수 있는데 반면, tuple은 원소의 개수에 제약이 없습니다.
함수에서 여러 개의 값들을 반환하는 경우에 아주 유용합니다.
이 tuple 클래스를 사용하려면 다음의 헤더를 포함해야 합니다.
#include <tuple>
make_tuple 함수
make_tuple은 주어진 인자들로부터 tuple 객체를 생성합니다.
이때, 선언된 tuple 객체의 원소 개수와 타입이 일치해야 합니다.
tuple<int, double, string> tup(0, 1.42, "Call me Tuple"); // tuple 선언
tup = make_tuple(1, 3.14, "change values"); // 새로운 원소들로 교체
using Values = tuple<int, double, string>; // 별명 사용
Values tup2 = tup;
가끔, tuple의 선언이 너무 길어지는 경우가 있는데, using 키워드를 이용해서 읽기 쉬운 코드를 작성할 수 있습니다.
get 함수
get 함수는 인덱스를 통해서 tuple의 원소에 대한 참조를 얻습니다.
그리고, C++ 14부터는 원소의 타입을 통해서도 원소에 대한 참조를 얻을 수 있습니다.
#include <iostream>
#include <tuple>
using namespace std;
int main(){
tuple<int, double, string> tup(0, 1.42, "Call me Tuple");
cout << get<0>(tup) << " " << get<1>(tup) << " " << get<2>(tup) << endl;
tup = make_tuple( 1, 3.14, "change values" );
cout << get<int>(tup) << " " << get<double>(tup) << " " << get<string>(tup) << endl;
tuple<string, string> same_type_tup("test", "test2");
//cout << get<string>(same_type_tup); // compile error
get<0>(tup) = 2;
get<1>(tup) = 3.1415;
cout << get<0>(tup) << " " << get<1>(tup) << " " << get<2>(tup) << endl;
}
▼출력
0 1.42 Call me Tuple
1 3.14 change values
2 3.1415 change values
하지만, 원소의 타입이 중복되어 구분하기 어려워지면, 타입을 통해서 원소에 접근할 수 없습니다.
tie 함수
tie는 주어진 인자의 참조로 구성된 tuple을 생성합니다.
이 함수를 쓰면, 지역 변수들에 tuple 원소의 값을 대입하는 효과를 얻을 수 있습니다.
#include <iostream>
#include <tuple> // for tie() and tuple
using namespace std;
using Values = tuple <int,char,float>; // 별명 사용
Values Func(){
return make_tuple(20,'g',17.5);
}
int main()
{
int i_val;
char ch_val;
float f_val;
tie(i_val, ch_val, f_val) = Func();
cout << "unpack tuple : ";
cout << i_val << " " << ch_val << " " << f_val;
cout << endl;
tie(i_val, ignore, f_val) = Func(); // ignore 사용
cout << "use ignore : ";
cout << i_val << " " << f_val;
cout << endl;
}
▼출력
unpack tuple : 20 g 17.5
use ignore : 20 17.5
만약, tie 함수에 ignore 키워드를 사용하면, ignore가 위치한 원소의 값은 무시하고 나머지 값을 받아옵니다.
tuple_cat 함수
tuple_cat은 두 개의 tuple을 합쳐서, 하나의 tuple을 생성합니다.
int main(){
Values tup1{20,'g',17.5};
Values tup2{11,'f',34.5};
auto tup3 = tuple_cat( tup1, tup2);
int size = tuple_size<decltype(tup3)>::value; // tup3의 원소 개수
cout << "concated size : " << size << endl;
cout << get<0>(tup3) << " " << get<1>(tup3) << " "
<< get<2>(tup3) << " " << get<3>(tup3) << " "
<< get<4>(tup3) << " " << get<5>(tup3) << endl;
}
▼출력
concated size : 6
20 g 17.5 11 f 34.5
위의 tuple_size <T>::value는 컴파일 시에 tuple의 원소 개수를 알려줍니다.
'C, C++ > 표준 라이브러리' 카테고리의 다른 글
[C++] 균일 초기화( uniform initialization )과 std::initializer_list (2) | 2024.08.31 |
---|---|
[C++] getline 함수 사용법 (0) | 2024.08.24 |
[C++] transform 사용법 (0) | 2024.08.03 |
[C++] string_view에 대한 설명과 사용법 (0) | 2024.07.30 |
[C++] weak_ptr에 대한 설명과 사용법 (0) | 2024.07.28 |