STL pair와 make_pair 완벽 이해하기 – map과 큐에서의 활용법
📌 두 개의 데이터를 하나로 묶는 가장 간단한 방법, pair로 해결하세요
안녕하세요.
오늘은 C++ STL에서 자주 사용되는 아주 중요한 도구 중 하나인 pair와 make_pair에 대해 알아보겠습니다.
처음에는 pair가 단순히 두 개의 값을 한 번에 다루는 구조처럼 보이지만, 실전에서는 map이나 priority_queue와 같은 다양한 STL 컨테이너에서 필수적으로 사용됩니다.
이 개념을 제대로 이해해두면, C++로 자료구조와 알고리즘을 다룰 때 훨씬 더 깔끔하고 효율적인 코드를 작성할 수 있어요.
특히 pair<A, B>는 두 개의 서로 다른 타입도 하나의 단위로 묶을 수 있기 때문에, 좌표, 키-값, 인덱스-값 쌍 등을 표현할 때 매우 유용합니다.
함께 사용하는 make_pair() 함수는 타입 추론까지 도와주기 때문에 코드가 훨씬 간결해지죠.
이 글에서는 pair와 make_pair의 기본 사용법부터 응용 사례, 주의사항까지 차근차근 알아보겠습니다.
📋 목차
🔗 pair란 무엇인가요?
C++ STL에서 제공하는 pair는 서로 다른 타입의 두 값을 하나로 묶는 구조체입니다.
예를 들어, 좌표 값 (x, y), 학생 번호와 이름, 키와 값 등 논리적으로 한 쌍으로 묶어서 관리하고 싶은 데이터를 표현할 때 유용하게 사용됩니다.
pair는 기본적으로 두 개의 public 멤버 first와 second를 갖고 있으며, 구조체처럼 직접 접근하여 사용할 수 있습니다.
또한 비교 연산자(<, ==, > 등)가 오버로딩되어 있어 정렬이나 조건 비교에도 유용하게 활용됩니다.
- 🧩두 개의 값을 한 단위로 묶고 싶을 때
- 🗺️map의 key-value 구조를 표현할 때
- 📚정렬 기준으로 사용되는 복합 자료형으로 활용
#include <iostream>
#include <utility>
using namespace std;
int main() {
pair<int, string> student = {101, "홍길동"};
cout << student.first << ", " << student.second << endl;
return 0;
}
위 예제에서는 정수형과 문자열을 묶은 pair를 생성한 뒤, 각각 first와 second 멤버에 접근하여 출력하고 있습니다.
이처럼 pair는 구조체처럼 쉽게 사용되며, 코드를 더 간결하고 직관적으로 만들어줍니다.
💡 TIP: pair는 구조체 정의 없이 두 개의 값을 묶고자 할 때 빠르게 쓸 수 있어 알고리즘 문제에서도 자주 사용됩니다.
🛠️ make_pair로 간편하게 생성하기
pair 객체를 생성할 때 make_pair() 함수를 사용하면, 타입을 일일이 명시하지 않아도 C++의 타입 추론 기능을 활용해 더욱 간단하고 안전하게 코드를 작성할 수 있습니다.
특히 복잡한 템플릿 구조를 사용할 때 매우 유용하며, 코드를 간결하고 가독성 있게 만들어 줍니다.
make_pair는 #include <utility> 헤더에 포함되어 있으며, 두 개의 값을 전달받아 pair 객체를 반환합니다.
반환된 객체는 그대로 변수에 저장하거나, map, priority_queue와 같은 컨테이너에서 즉시 활용할 수도 있습니다.
- ✨타입 명시 없이 자동으로 pair 생성
- 🔗map, vector 등에 삽입할 때 코드 간결화
- ✅템플릿 기반 함수에서 타입 유추 가능
#include <iostream>
#include <utility>
using namespace std;
int main() {
auto student = make_pair(2024, "이순신");
cout << student.first << " / " << student.second << endl;
return 0;
}
위 코드를 보면 auto 키워드와 make_pair()를 함께 사용하여 코드가 매우 간단해졌습니다.
템플릿 함수를 작성하거나, 다양한 타입을 조합해 pair를 만들 때는 이 방식이 훨씬 효율적입니다.
💎 핵심 포인트:
make_pair는 STL 컨테이너에서 pair를 값으로 저장할 때 가장 흔히 사용되는 함수입니다. 특히 map에 값을 삽입할 때 많이 사용됩니다.
⚙️ pair와 함께 쓰는 map과 priority_queue
pair는 STL에서 map과 priority_queue 같은 컨테이너와 함께 사용할 때 특히 그 진가를 발휘합니다.
map은 내부적으로 pair 형태의 key-value 쌍을 저장하며, priority_queue는 우선순위를 구성할 때 pair를 사용하여 다양한 기준으로 정렬할 수 있습니다.
map에서는 key가 pair일 수도 있고, value가 pair일 수도 있습니다.
priority_queue에서는 일반적으로 우선순위 값과 데이터를 묶어서 저장할 때 pair를 많이 활용합니다.
이런 활용법은 알고리즘 문제풀이에서 매우 자주 등장하며, 실무에서도 조건 정렬이나 큐 기반 로직을 구현할 때 자주 사용됩니다.
🗺️ map에서 pair 사용 예제
#include <iostream>
#include <map>
#include <utility>
using namespace std;
int main() {
map<int, pair<string, int>> students;
students[1001] = make_pair("홍길동", 90);
students[1002] = make_pair("이순신", 95);
for (auto& s : students) {
cout << s.first << ": " << s.second.first << ", " << s.second.second << endl;
}
return 0;
}
🚀 priority_queue에서 pair 사용 예제
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
priority_queue<pair<int, string>> pq;
pq.push({3, "Task A"});
pq.push({1, "Task B"});
pq.push({2, "Task C"});
while (!pq.empty()) {
cout << pq.top().second << " (Priority: " << pq.top().first << ")" << endl;
pq.pop();
}
return 0;
}
priority_queue에서는 기본적으로 pair의 first 값을 기준으로 정렬되므로, 이를 우선순위 값으로 사용하면 자동 정렬 큐를 손쉽게 구현할 수 있습니다.
이처럼 pair는 복잡한 자료구조를 단순화시키고, 로직을 명확하게 만드는 데 큰 도움을 줍니다.
🔌 pair의 비교 연산과 정렬 기준
C++ STL의 pair는 비교 연산자가 기본적으로 오버로딩되어 있어, 두 pair 객체 간의 <, >, == 비교가 가능합니다.
이는 내부적으로 first 값을 먼저 비교하고, first 값이 같을 경우 second 값을 기준으로 판단합니다.
이러한 특성은 sort() 함수나 set, map과 같은 컨테이너에서 자동 정렬 기능을 구현할 때 매우 유용하게 작용합니다.
또한 사용자 정의 정렬 기준이 필요한 경우, custom comparator를 정의하여 pair의 정렬 방식을 원하는 형태로 바꿀 수도 있습니다.
| 비교 방식 | 설명 |
|---|---|
pair1 < pair2 |
pair1.first가 작으면 true 같으면 second 비교 |
pair1 == pair2 |
first와 second 모두 같아야 true |
| 사용자 정의 정렬 | 람다 또는 함수 객체로 원하는 기준 설정 |
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<pair<int, int>> v = {{3, 5}, {1, 2}, {3, 1}};
sort(v.begin(), v.end());
for (auto p : v) {
cout << "(" << p.first << ", " << p.second << ") ";
}
return 0;
}
위 예제에서는 pair<int, int> 벡터를 정렬하면 first를 기준으로 정렬되고, 같은 값이 있을 경우 second를 기준으로 자동 정렬됩니다.
이처럼 별도 비교 함수를 만들지 않아도 pair만으로 안정적인 정렬이 가능하다는 점은 실전 코딩에서 매우 큰 장점입니다.
💡 TIP: 정렬 기준이 복잡하거나 특별한 조건이 필요한 경우에는 compare 함수를 직접 작성해 sort에 전달하면 원하는 정렬이 가능합니다.
💡 STL pair 활용 시 주의할 점
pair는 다양한 상황에서 유용하게 활용되지만, 무분별한 사용은 오히려 코드의 가독성을 해칠 수 있습니다.
두 값을 묶는 데는 탁월하지만, 너무 복잡한 구조를 생성하거나 의미 없는 데이터 조합으로 사용하는 경우엔 오히려 구조체를 명확히 정의하는 것이 더 나은 선택일 수 있습니다.
또한 first와 second라는 멤버명은 의미 전달이 어렵기 때문에, 사용 위치에 따라 주석이나 auto [a, b] 구조 분해 할당을 활용하는 것이 좋습니다.
모던 C++에서는 구조 분해(destructuring)를 지원하므로, 좀 더 직관적인 코드를 작성할 수 있습니다.
- 📛복잡한 구조는 struct 또는 class로 대체 고려
- 🔍first/second 대신 구조 분해 활용 시 가독성 향상
- ⚠️pair 간 비교 연산은 first 우선이라는 점 주의
#include <iostream>
#include <utility>
using namespace std;
int main() {
pair<int, string> user = {1, "Admin"};
auto [id, role] = user;
cout << "ID: " << id << ", Role: " << role << endl;
return 0;
}
위 예제처럼 구조 분해를 사용하면 first, second를 직접 쓰지 않고 원하는 이름으로 값을 분리해 사용할 수 있어, 유지보수와 가독성 모두에서 큰 도움이 됩니다.
C++17 이상을 사용하고 있다면 적극적으로 활용해보세요.
⚠️ 주의: pair 안에 또 다른 pair를 중첩하여 사용하는 경우, 코드 복잡도가 급격히 증가하므로 가능한 피하는 것이 좋습니다.
❓ 자주 묻는 질문 (FAQ)
pair는 어떤 상황에서 사용하면 좋을까요?
make_pair와 직접 pair 선언의 차이는 무엇인가요?
pair는 몇 개의 값을 저장할 수 있나요?
pair의 비교 기준은 어떻게 되나요?
map에서 pair를 어떻게 사용하나요?
priority_queue에서 pair는 왜 자주 사용되나요?
pair 안에 또 다른 pair를 넣어도 되나요?
C++17 이상에서 pair를 더 잘 쓰는 방법이 있을까요?
📌 pair와 make_pair, STL 컨테이너의 핵심 유틸리티
이번 글에서는 C++ STL에서 자주 사용되는 pair와 make_pair의 기본 개념부터 실전 활용까지 꼼꼼히 살펴보았습니다.
두 개의 값을 하나의 단위로 묶을 수 있다는 점에서 pair는 map, priority_queue, set 등 다양한 컨테이너에서 중요한 역할을 하며, 정렬이나 탐색 로직에서도 유용하게 활용됩니다.
특히 make_pair()를 활용하면 타입을 자동으로 추론하면서 간결한 코드를 작성할 수 있고, 비교 연산의 자동화와 구조 분해 할당을 통해 가독성까지 챙길 수 있습니다.
다만 복잡한 구조로 얽히는 경우에는 struct나 class로의 전환을 고려하는 것이 좋습니다.
pair는 STL 컨테이너와 알고리즘 사이의 접점을 만들어주는 핵심 도구라는 점, 꼭 기억해 두세요.
🏷️ 관련 태그 : pair, make_pair, C++ STL, map 사용법, priority_queue, 구조 분해, 정렬 기준, 키값쌍, 알고리즘 STL, 구조체 대체