C++ 초급 - 11. 표준 라이브러리(STL) (4 - std::pair, std::tuple (C++11 이후 다중 값 저장 컨테이너))

2025. 2. 22. 17:48프로그래밍 언어/C++

📌 11.4 std::pair, std::tuple (C++11 이후 다중 값 저장 컨테이너)

C++에서는 여러 개의 값을 한 번에 저장하기 위해 std::pair와 std::tuple을 제공한다.
이를 활용하면 여러 개의 변수를 하나의 단위로 관리할 수 있으며, std::get<>, std::tie(), 그리고 C++17의 구조적 바인딩을 사용하여 데이터를 효과적으로 다룰 수 있다.


📌 1. std::pair를 활용한 두 개의 값 저장

🔹 (1) std::pair란?

  • 두 개의 값(키-값 쌍 등)을 저장하는 C++ 표준 라이브러리 컨테이너.
  • 서로 다른 데이터 타입을 저장할 수 있음.
  • std::map, std::unordered_map에서 키-값 쌍으로 많이 사용됨.

💡 기본 문법

#include <utility>  // std::pair 포함

std::pair<int, std::string> p(1, "Apple");  // 정수와 문자열 저장

💡 예제: std::pair 기본 사용법

#include <iostream>
#include <utility>

int main() {
    std::pair<int, std::string> p1 = {1, "Apple"};  // {} 초기화 가능
    std::pair<int, double> p2(2, 3.14);  // () 초기화 가능

    std::cout << "p1: (" << p1.first << ", " << p1.second << ")" << std::endl;
    std::cout << "p2: (" << p2.first << ", " << p2.second << ")" << std::endl;

    return 0;
}

🔹 출력 결과

p1: (1, Apple)
p2: (2, 3.14)

💡 설명

  • first, second 멤버를 이용해 두 개의 값에 접근 가능.
  • 서로 다른 타입을 저장할 수 있어 유용함.

📌 2. std::tuple을 활용한 다중 값 저장

🔹 (1) std::tuple이란?

  • 여러 개의 값을 한 번에 저장할 수 있는 컨테이너 (std::pair의 확장형).
  • 다양한 타입의 여러 개의 변수를 하나의 튜플로 관리 가능.

💡 기본 문법

#include <tuple>  // std::tuple 포함

std::tuple<int, double, std::string> t(1, 3.14, "Hello");

💡 예제: std::tuple 기본 사용법

#include <iostream>
#include <tuple>

int main() {
    std::tuple<int, double, std::string> t(1, 3.14, "Hello");

    std::cout << "첫 번째 값: " << std::get<0>(t) << std::endl;
    std::cout << "두 번째 값: " << std::get<1>(t) << std::endl;
    std::cout << "세 번째 값: " << std::get<2>(t) << std::endl;

    return 0;
}

🔹 출력 결과

첫 번째 값: 1
두 번째 값: 3.14
세 번째 값: Hello

💡 설명

  • std::tuple<int, double, std::string>으로 서로 다른 타입을 하나의 튜플로 묶을 수 있음.
  • std::get<index>()을 사용하여 요소를 접근.

📌 3. std::get<>, std::tie()를 이용한 요소 접근

🔹 (1) std::get<>을 활용한 요소 접근

💡 예제: std::get<>을 이용한 std::tuple 접근

#include <iostream>
#include <tuple>

int main() {
    std::tuple<int, char, float> data(42, 'A', 3.14f);

    int num = std::get<0>(data);
    char ch = std::get<1>(data);
    float f = std::get<2>(data);

    std::cout << "정수: " << num << ", 문자: " << ch << ", 실수: " << f << std::endl;

    return 0;
}

🔹 출력 결과

정수: 42, 문자: A, 실수: 3.14

🔹 (2) std::tie()를 활용한 값 해체

  • std::tie()를 사용하면 튜플을 개별 변수로 쉽게 해체할 수 있음.

💡 예제: std::tie() 사용

#include <iostream>
#include <tuple>

int main() {
    std::tuple<int, std::string, double> t(10, "Hello", 2.71);

    int num;
    std::string text;
    double d;

    std::tie(num, text, d) = t;  // 튜플을 개별 변수에 할당

    std::cout << "정수: " << num << ", 문자열: " << text << ", 실수: " << d << std::endl;

    return 0;
}

🔹 출력 결과

정수: 10, 문자열: Hello, 실수: 2.71

💡 설명

  • std::tie()를 사용하면 튜플을 개별 변수로 해체하여 저장 가능.

📌 4. 구조적 바인딩을 활용한 std::tuple 해체 (C++17)

🔹 (1) C++17의 structured bindings를 활용한 편리한 튜플 해체

  • C++17부터 std::tie() 없이 auto를 사용하여 자동 해체 가능.

💡 예제: structured bindings을 활용한 std::tuple 해체

#include <iostream>
#include <tuple>

int main() {
    std::tuple<int, std::string, float> t(100, "C++", 9.99);

    auto [num, text, price] = t;  // C++17 구조적 바인딩

    std::cout << "정수: " << num << ", 문자열: " << text << ", 실수: " << price << std::endl;

    return 0;
}

🔹 출력 결과

정수: 100, 문자열: C++, 실수: 9.99

💡 설명

  • auto [변수1, 변수2, 변수3] = 튜플; 방식으로 튜플을 자동 해체할 수 있음.
  • std::tie()보다 더 직관적이고 간결한 문법 제공.

📌 5. 정리

개념  설명
std::pair 두 개의 값을 저장하는 간단한 컨테이너 (first, second 제공)
std::tuple 여러 개의 값을 저장하는 확장된 컨테이너
std::get<> std::tuple의 특정 인덱스 요소를 가져옴
std::tie() std::tuple을 여러 개의 변수로 분해
C++17 structured bindings auto [a, b, c] = tuple; 방식으로 자동 해체