[C++] std::tuple 사용법

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의 원소 개수를 알려줍니다.

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유