본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : std::pair, std::tuple (98, 11, 17)

by snowoods 2025. 8. 24.

Modern C++

std::pair와 std::tuple

 

개요

std::pairstd::tuple은 C++ 표준 라이브러리에서 제공하는 유틸리티 클래스로, 여러 값을 하나의 단위로 묶어서 다룰 수 있게 해줍니다. 주로 함수에서 여러 값을 반환하거나, 여러 값을 한 번에 전달해야 할 때 유용하게 사용됩니다.

 

C++ 버전별 주요 키워드 도입 시기

  • std::pair: C++98/03부터 도입
  • std::tuple: C++11에서 도입
  • 구조화된 바인딩(Structured Binding): C++17에서 도입

 

내용 설명

std::pair

  • 두 개의 서로 다른 타입의 값을 하나의 단위로 저장할 수 있는 클래스 템플릿
  • firstsecond라는 두 개의 공개 멤버 변수를 가짐
  • 비교 연산자(==, !=, <, <=, >, >=)가 오버로딩되어 있음

 

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

 

활용팁

  1. 가독성을 위해 의미 있는 이름이 필요하다면 구조체를 사용하세요.
  2. 일반적인 프로그래밍이 필요하거나 임시적인 데이터 그룹화가 필요할 때는 std::pairstd::tuple을 사용하세요.
  3. C++17 이상을 사용한다면 구조화된 바인딩을 적극 활용하여 코드의 가독성을 높이세요.
  4. std::tie를 사용하면 std::tuple의 요소를 변수에 쉽게 할당할 수 있습니다.
  5. std::ignore를 사용하면 std::tie에서 특정 값을 무시할 수 있습니다.
  6. std::pair는 맵(std::map)이나 정렬된 컨테이너에서 자주 사용됩니다.
  7. std::tuple은 함수에서 여러 값을 반환할 때 유용합니다.