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; 방식으로 자동 해체 |