template < class T1, class T2 > struct pair;
std::pair는 위 코드에서 보는것 처럼 템플릿 구조체입니다.
template<typename T> 이랑 template<class T> 동일한 의미입니다.
현재는 typename을 쓰는것이 표준형식입니다. 호환성을 위해 과거에 사용하던 class로 표기법을 지원하고 있습니다.
(둘의 차이에 대한 정리글 링크)
(상세 레퍼런스보기: 링크)
헤더 파일
#include<utility>
#include<algorithm>
#include<vector>
결론적으론 std::pair는 위 헤더 3개중에 아무거나 include하셔도 됩니다.
사실 std::pair는 utility속에 들어있습니다.
그러나 algorithm과 vector헤더파일이 utility헤더를 포함하고 있기 때문에 셋 중 아무거나 include해도 된다는 것입니다.
생성 방법
pair<int, int> p; // int 타입 데이터 2개를 관리할 수 있는 pair 클래스의 p객체
pair<int, double> p;// int타입과 double 타입 데이터를 한번에 관리할 수 있는 pair 클래스의 p객체
pair<double, double> p;// 각 각의 double 타입 데이터를 한번에 관리할 수 있는 객체
pair<int, char> p;// int 타입과 char타입 테이터를 하나로 묶어서 관리할 수 있는 p객체
위와 같이 생성합니다.
보면 아시겠지만 위 4가지 경우 말고도 다양하게 사용 가능합니다.
기본 사용 방법
p.first //첫번째 인자 반환
p.second //두번째 인자 반환
make_pair(값1,값2) // (값1,값2)를 쌍으로하는 pair를 만들어서 반환합니다.
기본적인 사용법입니다.
pair<int,int> p;
p.first=1;
p.first=2;
//(1,2)가 p에 저장됩니다.
pair<int,int> p;
p=make_pair(1,2);
//(1,2)가 p에 저장됩니다.
응용하면 위와 같은 사용법들이 가능합니다.
vector<pair<int,int>> v;
for(int i=0; i<n; i++)
{
int x,y;
cin>>x>>y;
pair<int,int> temp=make_pair(x,y);
v.push_back(temp);
}
벡터와 함께 사용하면 유용하게 사용할 수 있습니다.
대소 비교
pair 오브젝트끼리 대소비교가 가능합니다.
- 첫 번째 값을 비교. 만약에 같다면?
- 두 번째 값을 통해서 판단. 이것조차 같다면 false 반환
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
pair<int,int> p1=make_pair(1,10);
pair<int,int> p2=make_pair(1,10);
if(p1>p2)
{
cout<<"p1이 더 큼";
}
else
{
cout<<"p2가 더 큼";
}
}
//같은 값일경우 false나옴. 따라서 else문쪽이 실행됨
위 예시는 같은 값을 지닌 pair끼리 비교했기 때문에 최종적으로 false가 나와서 else문이 실행됩니다.
뿐만아니라 다음과 같은 연산자가 사용 가능합니다.
std::swap 사용 가능
swap함수는 이름 그대로 값을 서로 변경해줍니다.
std::pair에도 사용이 가능합니다.
사용한다면 쌍을 통째로 바꿔줍니다.
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
pair<int,int> p1=make_pair(1,10);
pair<int,int> p2=make_pair(2,20);
swap(p1,p2);
cout<<p1.first<<" "<<p1.second<<endl;
cout<<p2.first<<" "<<p2.second<<endl;
}
//결과
//p1.first:2 , p1.second:20
//p2.first:1 , p2.second:10
'C++ > STL' 카테고리의 다른 글
[C++] 2개이상의 묶음으로 저장하기(std::tuple) (0) | 2022.08.24 |
---|---|
[C++] 올림,내림,버림,반올림 (0) | 2022.08.20 |
[C++] STL의 반복자(iterator) (0) | 2022.08.07 |
[C++] 아주 기본적인 연결 리스트(std::forward_list) (0) | 2022.08.05 |
[C++] 메모리 복사(memcpy와 std::copy) (0) | 2022.07.21 |