No Rules Rules
STL tuple (feat. c++, make_tuple, tuple_size, tuple_cat) 본문
STL pair를 먼저 확인해주세요!
이전 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에 대해서 알아보겠습니다.
'언어 > STL' 카테고리의 다른 글
STL map 내맘대로 sort (feat. c++, map, pair, value) (0) | 2022.09.21 |
---|---|
STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds) (0) | 2022.07.20 |
STL pair (feat. c++, make_pair) (0) | 2022.07.20 |
STL이란? (feat. Modern C++) (0) | 2022.07.20 |