반응형

Intro


이번 포스팅에서는 tuple에 대해 알아보도록 하겠습니다. 튜플은 보통 프로그래밍을 하다 보면 함께 사용되는 변수들을 하나로 묶어서 사용할 때 사용합니다. 특히 함수의 반환 값으로 2개 이상의 값을 반환할 때가 자주 사용됩니다. 보통은 변수들을 묶을 때 구조체(struct)를 사용하지만 구조체를 구현하면 귀찮기 때문에 tuple을 사용하면 편리합니다. 보통 2개의 데이터를 묶을 때는 std::pair을 사용하고 3개 이상이면 std::tuple를 사용합니다.

tuple


간단한 코드를 통해 tuple을 사용해 보겠습니다. tuple을 사용하기 위해선 tuple을 include 해 줘야 합니다. #include

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    int nNum = 10;
    char a = 'A';
    string str = "anabebe";
    tuple<int, char, string>User = tuple<int, char, string>(nNum, a, str);
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;
    get<0>(User) = 20;
    get<1>(User) = 'B';
    get<2>(User) = "anebebe2";
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;

}

결과

tuple에 int, char, string 세가지 변수를 tuple로 묶었습니다. tuple을 값을 참조할 때 get을 사용합니다. get은 해당 값을 얻을 수 있고, 저장된 값을 변경할 수도 있습니다. 값 얻을 때 : get<0>(User), 값 바꿀 때 : get<0>(User) = 10;
그리고 tuple의 값을 호출할 때 호출하는 자료의 형이 맞지 않으면 인수 목록이 일치하는 생성자의 인스턴트가 없다는 메세지와 오류가 뜹니다.

make_tuple
방금 전 코드는 변수로 tuple을 초기화 했는데 make_tuple를 사용하면 더 편리하게 tuple을 정의할 수 있습니다. 코드를 통해 확인하도록 하겠습니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{

    tuple<int, char, string>User = make_tuple(30, 'C',"anabebe3");
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;

}

결과

이전 코드와의 차이는 tuple 생성과 make_tuple를 통해 User라는 tuple을 초기화해줬습니다. 물론 tuple을 선언할 때 빈 값으로 생성도 가능합니다.

tuple_size
tuple의 저장된 데이터 개수를 알고 싶을 때 std::tuple_size를 사용합니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    tuple<int,int,int, char, string>User = make_tuple(10,20,30, 'C',"anabebe3");
    auto nTupleCount = tuple_size <decltype(User)>::value;
    cout <<"저장된 User의 요소 수 : " <<nTupleCount << endl;
}

결과

tuple_cat
tuple_cat를 사용하면 tuple와 tuple를 합칠 수 있습니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    tuple<int, char, string>User = make_tuple(10, 'A', "anabebe1");
    tuple<int, char, string>User2 = make_tuple(20, 'B', "anabebe2");
    auto User_cat = tuple_cat(User, User2);
    cout << get<0>(User_cat)<<endl;
    cout << get<1>(User_cat) << endl;
    cout << get<2>(User_cat) << endl;
    cout << get<3>(User_cat) << endl;
    cout << get<4>(User_cat) << endl;
    cout << get<5>(User_cat) << endl;

}

결과

User_cat의 값을 출력해주면 User + User2의 인덱스의 순서대로 User_cat에 저장 되는걸 볼 수 있습니다.

마무리


이번 포스팅에서는 tuple에 대해 다뤄 봤는데 tuple의 가장 큰 장점은 귀찮게 구조체나 컨테이너를 사용하는 번거로움을 줄여준다고 생각합니다.
그럼 이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

'[C++ STL]' 카테고리의 다른 글

[C++ STL - forward_list]  (0) 2021.06.24
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr]  (0) 2021.06.08
[C++ STL - range based for]  (0) 2021.05.13
[C++ STL - 람다(lambda)]  (0) 2021.05.04
[C++ STL - auto]  (0) 2021.04.28

+ Recent posts