2015년 6월 8일 월요일

[C++11] tuple


[C++11] tuple C++11 / Programming
2014.04.30. 17:33 수정 삭제
전용뷰어 보기
함수를 만들때 간혹 2개 이상의 값을 한번에 리턴해야 할 경우가 있습니다. 이럴때 기존에는 구조체를 정의하고 구조체 변수를 하나 선언한 후 값을 넣고 리턴해야 했습니다. 단지 리턴값을 여러개 받고 싶을 뿐인데 구조체를 정의해야 한다는 것이 좀 부담이었죠.

C++11에서는 이런 불편함을 없애기 위해 tuple을 도입했습니다. tuple을 사용하면 2개 이상의 변수를 한번에 묶어서 리턴할 수 있습니다. tuple을 사용하기 위해서는 #include <tuple>을 추가해야 합니다. tuple은 다음과 같이 생성하고 사용할 수 있습니다.

// int, int, string 타입으로 tuple 생성
std::tuple<int, int, std::string> items = std::make_tuple(1, 2, "test");
// std::tuple<int, int, std::string> items(1, 2, "test"); // 이렇게 해도 가능합니다

std::cout << std::get<0>(items) << std::endl; // 첫번째 값을 출력합니다. 값은 1입니다.
std::cout << std::get<1>(items) << std::endl; // 두번째 값을 출력합니다. 값은 2입니다.
std::cout << std::get<2>(items) << std::endl; // 세번째 값을 출력합니다. 값은 test입니다.

std::get<0>(items) = 5; // 첫번째 값을 5로 변경합니다.
빈 값으로 tuple을 생성하고 나중에 값을 저장할 수도 있습니다.

tuple의 데이터 개수는 tuple_size 함수를 이용해 알아낼수 있습니다. 위와 같이 tuple을 만들었다면 count가 3이 될것입니다.
auto count = std::tuple_size<decltype(items)>::value;


tie 함수를 이용하면 tuple에 데이터를 하나씩 넣지 않고 여러개를 한번에 넣거나 읽어올수도 있습니다.
std::tuple<int, int, std::string> items(1, 2, "test");

int a, b;
std::string str;
std::tie(a, b, str) = items; // a는1, b는 2, str은 test가 들어갑니다.


모두 넣지 않고 일부만 넣을수도 있습니다.
std::tie(a, std::ignore, str) = items; // a는1, str은 test가 들어갑니다.


tuple을 합치려면 tuple_cat 함수를 사용하면 됩니다.
std::tuple<int, int, std::string> items1(1, 2, "test1");
std::tuple<int, int, std::string> items2(3, 4, "test2");

auto tupleSet = std::tuple_cat(items1, items2); // tupleSet은 1, 2, test1, 3, 4, test2 가 됩니다.

댓글 없음:

댓글 쓰기