std::pair란?
- 두 개의 이질적인 데이터 타입의 값을 하나로 묶어서 저장하는데 사용되는 템플릿 클래스
- 두 개의 값을 리턴해야 해야 하거나, 두 개의 값을 key와 value로 사용하는데 유용하다
- <utility>에 정의되어 있다.
std::pair의 구현 방식
- 실제 구현 코드는 아니지만, 이러한 방식으로 구현되어 있다
template <typename T1, typename T2>
struct pair {
T1 first;
T2 second;
// 기본 생성자
pair() : first(T1()), second(T2()) {}
// 사용자 정의 생성자
pair(const T1& a, const T2& b) : first(a), second(b) {}
// 복사 생성자
template <typename U1, typename U2>
pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
// 이동 생성자
template <typename U1, typename U2>
pair(pair<U1, U2>&& p) : first(std::move(p.first)), second(std::move(p.second)) {}
// 복사 대입 연산자
pair& operator=(const pair& p) {
if (this != &p) {
first = p.first;
second = p.second;
}
return *this;
}
// 이동 대입 연산자
pair& operator=(pair&& p) noexcept {
if (this != &p) {
first = std::move(p.first);
second = std::move(p.second);
}
return *this;
}
// 비교 연산자
bool operator==(const pair& p) const {
return first == p.first && second == p.second;
}
bool operator!=(const pair& p) const {
return !(*this == p);
}
bool operator<(const pair& p) const {
return first < p.first || (!(p.first < first) && second < p.second);
}
bool operator<=(const pair& p) const {
return !(p < *this);
}
bool operator>(const pair& p) const {
return p < *this;
}
bool operator>=(const pair& p) const {
return !(*this < p);
}
};
이거 말고 다른 기능은 없나요?
- std::pair는 map, queue, stack과 같은 컨테이너가 아니다
- std::map과 std::unordered_map과 같은 연관 컨테이너에서 key-value쌍을 나타내기 위해 많이 사용된다
- 두 개의 값을 묶는 단순한 구조체로, 삽입, 삭제, 검색 등의 메서드를 제공하지 않는다.
- 삽입, 삭제, 검색 등은 std::pair를 사용하는 컨테이너에 제공된다
선언 및 초기화
#include <utility>
std::pair<int, std::string> p1; // 정수와 문자열을 쌍으로 가지는 pair
std::pair<int, std::string> p2(42, "Hello"); // 생성자 초기화
auto p3 = std::make_pair(42, "Hello"); // make_pair 함수 사용
멤버 변수
first와 second 멤버 변수가 존재한다
std::cout << p2.first << " " << p2.second << std::endl; // 42 Hello
생성자
기본 생성자, 복사 생성자, 이동 생성자, 사용자 정의 생성자를 사용할 수 있다.
std::pair<int, std::string> p4(p2); // 복사 생성자
std::pair<int, std::string> p5(std::move(p2)); // 이동 생성자
비교 연산자
위 구현 코드에서 알 수 있듯이 비교 연산 또한 지원한다
사전식 순서로 비교하며, 첫 번째 원소와 비교하고, 두 번째 원소와 비교한다.
std::pair<int, std::string> p6(42, "Hello");
std::pair<int, std::string> p7(42, "World");
if (p6 == p2) { /* ... */ } // true
if (p6 < p7) { /* ... */ } // true
활용 예시
함수에서 여러 개의 값을 반환해야 하는 경우
std::pair<int, std::string> getAgeAndName() {
return std::make_pair(30, "Alice");
}
auto result = getAgeAndName();
std::cout << "Age: " << result.first << ", Name: " << result.second << std::endl;
map과 같은 STL에서 key-value 쌍을 저장하는 경우
#include <map>
std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "one"));
myMap.insert(std::make_pair(2, "two"));
for (const auto& pair : myMap) {
std::cout << pair.first << " => " << pair.second << std::endl;
}
'Data Structure > C++ STL' 카테고리의 다른 글
[C++ STL] std::tuple (0) | 2024.06.30 |
---|---|
[C++ STL] std::string (0) | 2024.06.30 |
[C++ STL] 3.4 C++ 해시 테이블 (0) | 2024.06.23 |
[C++ STL] 2.6 그래프(graph) (0) | 2024.06.21 |
[C++ STL] 2.5 힙(Heap) (0) | 2024.06.21 |