std::pair와 std::tuple
개요
std::pair
와 std::tuple
은 C++ 표준 라이브러리에서 제공하는 유틸리티 클래스로, 여러 값을 하나의 단위로 묶어서 다룰 수 있게 해줍니다. 주로 함수에서 여러 값을 반환하거나, 여러 값을 한 번에 전달해야 할 때 유용하게 사용됩니다.
C++ 버전별 주요 키워드 도입 시기
std::pair
: C++98/03부터 도입std::tuple
: C++11에서 도입- 구조화된 바인딩(Structured Binding): C++17에서 도입
내용 설명
std::pair
- 두 개의 서로 다른 타입의 값을 하나의 단위로 저장할 수 있는 클래스 템플릿
first
와second
라는 두 개의 공개 멤버 변수를 가짐- 비교 연산자(
==
,!=
,<
,<=
,>
,>=
)가 오버로딩되어 있음
std::tuple
- 두 개 이상의 서로 다른 타입의 값을 하나의 단위로 저장할 수 있는 클래스 템플릿
std::get<index>
를 사용하여 특정 위치의 요소에 접근std::make_tuple
을 사용하여 간편하게 생성 가능
구조체 vs std::pair/std::tuple
- 구조체는 의미 있는 이름을 가진 멤버 변수를 사용하므로 가독성이 좋음
- std::pair/std::tuple은 임시적인 데이터 그룹화에 유용하며, 특히 일반적인 프로그래밍에서 유용
예제 코드
#include <cstdint>
#include <iostream>
#include <string>
#include <tuple>
#include <utility>
struct DataBlaBla
{
std::int32_t i;
float j;
};
// std::tuple을 반환하는 함수
std::tuple<std::int32_t, std::string, float> some_functions(
const std::int32_t input)
{
return std::make_tuple(input + 1,
std::to_string(input + 2),
static_cast<float>(input + 3));
}
// 구조체를 반환하는 함수
DataBlaBla some_functions2(const std::int32_t input)
{
return DataBlaBla{input + 1, static_cast<float>(input + 3)};
}
int main()
{
// std::pair 예제
auto my_pair = std::pair<std::int32_t, float>{1337, 42.0F};
std::cout << "Pair - first: " << my_pair.first << '\n';
std::cout << "Pair - second: " << my_pair.second << '\n\n';
// std::tuple 예제
auto my_tuple =
std::tuple<std::int32_t, float, std::string>{1337, 42.0F, "Jan"};
std::cout << "Tuple - 0: " << std::get<0>(my_tuple) << '\n';
std::cout << "Tuple - 1: " << std::get<1>(my_tuple) << '\n';
std::cout << "Tuple - 2: " << std::get<2>(my_tuple) << "\n\n";
// 함수 반환값 사용 예시 (인덱스 기반 접근)
const auto result = some_functions(42);
std::cout << "Function return - 0: " << std::get<0>(result) << '\n';
std::cout << "Function return - 1: " << std::get<1>(result) << '\n';
std::cout << "Function return - 2: " << std::get<2>(result) << "\n\n";
// 구조화된 바인딩 (C++17)
const auto &[i, s, f] = some_functions(42);
std::cout << "Structured binding - i: " << i << '\n';
std::cout << "Structured binding - s: " << s << '\n';
std::cout << "Structured binding - f: " << f << "\n\n";
// 구조체와 구조화된 바인딩
const auto &[i1, f1] = some_functions2(42);
std::cout << "Struct binding - i1: " << i1 << '\n';
std::cout << "Struct binding - f1: " << f1 << '\n';
return 0;
}
실행 결과
Pair - first: 1337
Pair - second: 42
Tuple - 0: 1337
Tuple - 1: 42
Tuple - 2: Jan
Function return - 0: 43
Function return - 1: 44
Function return - 2: 45
Structured binding - i: 43
Structured binding - s: 44
Structured binding - f: 45
Struct binding - i1: 43
Struct binding - f1: 45
활용팁
- 가독성을 위해 의미 있는 이름이 필요하다면 구조체를 사용하세요.
- 일반적인 프로그래밍이 필요하거나 임시적인 데이터 그룹화가 필요할 때는
std::pair
나std::tuple
을 사용하세요. - C++17 이상을 사용한다면 구조화된 바인딩을 적극 활용하여 코드의 가독성을 높이세요.
std::tie
를 사용하면std::tuple
의 요소를 변수에 쉽게 할당할 수 있습니다.std::ignore
를 사용하면std::tie
에서 특정 값을 무시할 수 있습니다.std::pair
는 맵(std::map
)이나 정렬된 컨테이너에서 자주 사용됩니다.std::tuple
은 함수에서 여러 값을 반환할 때 유용합니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : std::span (20) (1) | 2025.08.23 |
---|---|
Modern C++ : std::vector, emplace_back vs push_back (98, 11, 17) (0) | 2025.08.22 |
Modern C++ : std::vector (98, 11, 14, 17, 20) (0) | 2025.08.21 |
Modern C++ : template, std::span (20) (0) | 2025.08.20 |
Modern C++ : perfect forwarding (11) (1) | 2025.08.19 |
Modern C++ : rvalue reference summary (11) (2) | 2025.08.18 |
Modern C++ : lvalue, rvalue, value category (98, 11) (2) | 2025.08.17 |
Modern C++ : rvalue reference (98, 11) (1) | 2025.08.16 |