서론
pair는 두 종류의 자료를 하나의 컨테이너에 저장할 수 있는 템플릿이다.
순번 | 이름 |
1 | 김자료 |
2 | 이구조 |
3 | 박페어 |
위 테이블의 자료를 벡터에 저장하려고 한다.
우선 벡터를 두 개 만들고 첫 번째 벡터에 순번을 넣고 두 번째 벡터에 이름을 넣는 방법이 있다.
0 | 1 | 2 | |
V1 | 1 | 2 | 3 |
V2 | 김자료 | 이구조 | 박페어 |
그러나 pair를 이용하면 하나의 벡터로 만들 수 있다.
0 | 1 | 2 | ||||
V1 | first | second | first | second | first | second |
1 | 김자료 | 2 | 이구조 | 3 | 박페어 |
두종류의 연관성을 갖는 자료가 하나의 벡터에 들어간다는 것만으로도 상당히 유용하게 쓰인다. pair는 템플릿이므로 벡터 이외에도 큐, 우선순위 큐 등 다양한 컨테이너에 들어갈 수 있다.
pair VS 구조체
pair를 이용해서 위의 테이블을 하나의 벡터에 넣었다. 그러나 구조체를 이용할 수도 있다. 그렇다면 무엇을 써야 할까? 둘을 비교해보자
pair 장점
- 구조체를 만들지 않으므로 알고리즘 문제풀이에서는 비교적 간편하다.
구조체 장점
- first, second로 고정된 pair와 달리 name, number와 같이 멤버 변수 이름을 자유롭게 명명하여 가독성이 뛰어남
- 3개 이상의 멤버 변수를 가질 수 있음
- 추후 멤버변수를 추가할 수 있음
사실 일반적인 개발에서는 pair가 구조체 대비 가지는 장점이 딱히 없다. 그러나 알고리즘 문제풀이에 한정하여 비교적 (약간) 간편하다. 무엇보다 변수 이름 짓느라 생각하는 시간을 생략할 수 있다!
구현
다양한 pair 선언 방법들과 출력
pair<int, int>p; // pair<first 자료형, second 자료형>이름 p.first = 1; p.second = 2; cout<<p.first<<" "<<p.second<<endl; // 출력 : 1 2
pair<int, int>p2 = make_pair(3, 4); cout<<p2.first<<" "<<p2.second<<endl; // 출력 : 3 4
pair<int, int>p3(4, 5); cout<<p3.first<<" "<<p3.second<<endl; // 출력 : 4 5
벡터에 pair 저장
vector<pair<int, string>>v; v.push_back(make_pair(1, "김자료")); v.push_back({2, "이구조"}); // {first, second} == make_pair(first, second) v.push_back({3, "박페어"}); cout<<v[0].first << " "<<v[0].second<<endl; // 출력 : 1 김자료 cout<<v[1].first << " "<<v[1].second<<endl; // 출력 : 2 이구조 cout<<v[2].first << " "<<v[2].second<<endl; // 출력 : 3 박페어
참고
https://en.cppreference.com/w/cpp/utility/pair
https://www.cplusplus.com/reference/utility/pair