No Rules Rules

STL tuple (feat. c++, make_tuple, tuple_size, tuple_cat) 본문

언어/STL

STL tuple (feat. c++, make_tuple, tuple_size, tuple_cat)

개발하는 완두콩 2022. 7. 20. 13:34
728x90
반응형

 

STL pair를 먼저 확인해주세요!
 

STL pair (feat. make_pair)

우리가 사용하는 일반적인 자료형은 char, short, int, float, double 등과 같습니다. 이는 하나의 정보를 하나의 공간에 담는 것을 의미하는데요. 그럼 두개의 정보를 하나의 공간에 담고 싶은 경우는

kim519620.tistory.com

 

이전 pair에서의 아쉬웠던 점!

바로 두개의 변수만을 취할 수 있다! 입니다.

그럼 3개 이상의 변수를 취할때는 어떻게 해야 할까요?

 

STL tuple을 사용한다!

구글링을 하다보면 tuple로 사용할 수 있는 자료형의 최대 개수는 10개라고 되어 있습니다.

하지만 이것은 이전 C++ TR1에서의 경우고 C++ TR2가 정식 릴리즈된 C++17부터는 사실상 개수 제한은 없습니다.

왜냐면 정의할 수 있는 typename이 C++17부터는 가변 파라미터팩 으로 구현되어 있거든요!

단, C++11은 정말 최대 개수가 10개입니다. 이 점은 유의하셔야 합니다.

 

STL tuple은 pair처럼 지칭하는 변수가 존재하지 않습니다.

pair의 경우, 무조건 두개의 변수로 이루어지기 때문에 first, second 라는 변수명을 가졌지만

tuple의 경우, 몇개의 변수가 올지 알 수 없거든요.

그럼 어떻게 접근할 수 있을까요?

 

std::get<접근할 인덱스(0부터 시작)>(tuple 변수명)

 

코드로 보면 다음과 같습니다.

#include <tuple>            // tuple은 include가 필요합니다.

int main()
{
    std::tuple<char, short, int, double> tuple_value;
    std::get<0>(tuple_value) = 1;           // tuple 변수의 char 자료형에 값을 입력합니다.
    std::get<1>(tuple_value) = 2;           // tuple 변수의 short 자료형에 값을 입력합니다.
    std::get<2>(tuple_value) = 3;           // tuple 변수의 int 자료형에 값을 입력합니다.
    std::get<3>(tuple_value) = 4.5;         // tuple 변수의 double 자료형에 값을 입력합니다.
}

굉장히 간단하죠?

물론 tuple 선언과 동시에 초기화도 가능한데요.

위 코드의 입력값을 기준으로 초기화를 한다면, 다음과 같습니다.

#include <tuple>

int main()
{
    // 순서대로 초기화됩니다.
    std::tuple<char, short, int, double> tuple_value{ 1,2,3,4.5 };
    // 순서대로 초기화됩니다.
    std::tuple<char, short, int, double> tuple_value( 1,2,3,4.5 );
    // make_tuple로 tuple을 생성해서 tuple에 대입합니다.
    std::tuple<char, short, int, double> tuple_value = std::make_tuple<char, short, int, double>(1, 2, 3, 4.5);
    // make_tuple의 자료형 정의는 대입할 tuple의 자료형이 정의되어 있다면 생략할 수 있습니다.
    // 즉, 대입할 자료형이 auto라면 내가 원하는 자료형으로 정의되지 않을 수 있습니다.
    std::tuple<char, short, int, double> tuple_value = std::make_tuple(1, 2, 3, 4.5);
}

tuple 변수의 총 개수를 알고 싶을때는 std::tuple_size를 이용하면 됩니다.

#include <tuple>

int main()
{
    std::tuple<char, short, int, double> tuple_value = std::make_tuple(1, 2, 3, 4.5);
    int tuple_count = std::tuple_size<decltype(tuple_value)>::value;     // tuple_count는 4입니다.
}

 

decltype이란?

decltype(변수명) 은 변수명의 자료형을 반환합니다.

가령, 위의 코드에서 decltype(tuple_count) temp 라는 코드를 추가해보세요.

temp는 int형인 것을 확인할 수 있습니다

C++11에서 추가되었습니다.

 

그밖에도 사용빈도는 적으나, 서로 다른 tuple들을 하나의 tuple로 합치는 std::tuple_cat이라는 녀석도 있습니다.

반응형
#include <tuple>

int main()
{
    std::tuple<char, short, int> tuple_value1 = std::make_tuple(1, 2, 3);
    std::tuple<double, float> tuple_value2 = std::make_tuple(1.2, 3.4f);
    // 두개의 tuple을 하나의 tuple로 합칠 수 있습니다.
    std::tuple<char, short, int, double, float> tuple_value3 = std::tuple_cat(tuple_value1, tuple_value2);
    // 순서에 따라 합쳐진 tuple의 자료형이 달라질 수 있습니다.
    std::tuple<double, float, char, short, int> tuple_value4 = std::tuple_cat(tuple_value2, tuple_value1);
}

STL tuple은 다수의 구조체를 단순화하여 코드를 줄일 수 있다는 장점이 있습니다.

하지만 장점만 있는건 아닌데요.

 

tuple 내 각각의 자료형이 무엇을 의미하는지 반드시 주석으로 표시하자!

 

어제 짰던 코드도 기억나지 않는게 현실입니다. (슬프네요...)

꼭 협업하는 동료를 위해서만이 아니라 나를 위해서라도 주석은 필!수!입!니!다!

다음은 STL chrono에 대해서 알아보겠습니다.

728x90
반응형
Comments