Data Structure/C++ STL

[C++ STL] std::pair

lumana 2024. 6. 30. 18:19

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