[C++, STL] 알고리즘 문제풀이를 위한 pair

서론

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

Leave a Comment