반응형

페어(Pair)란?


#include <utility> 헤더 파일에 존재하는 STL이다.


하지만, algorithm, vector와 같은 헤더파일에서 이미 include하고 있기에 따로 utility를 include해 줄 필요는 없다.


pair를 사용하면 두 자료형 T1, T2를 묶을 수 있게 된다.


무조건 2개를 묶어야 하고 첫 번째 자료는 first, 두 번째 자료는 second로 접근이 가능하다.


pair의 기본 코딩 방식은 다음과 같다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdio>
 
using namespace std;
 
pair<intchar> p;
 
int main()
{
    p.first = 1;
    p.second = 'a';
 
    printf("%d %c", p.first, p.second);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



make_pair :: pair를 만들어 주는 함수이다. p.first = x, p.second = y 이런식으로 대입하지 않고


p = make_pair(x, y);로 대입이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdio>
#include <utility>
 
using namespace std;
 
pair<intchar> p;
 
int main()
{
    p = make_pair(1'a');
    
    printf("%d %c", p.first, p.second);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



vector에 넣을 때는 vector의 형식은 vector<pair<int, char>> 같은 형식을 취해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdio>
#include <utility>
#include <vector>
 
using namespace std;
 
pair<intchar> p;
 
vector<pair<intchar>> vc;
 
int main()
{
    vc.push_back(make_pair(1'a'));
    
    printf("%d %c", vc[0].first, vc[0].second);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



typedef를 통해 pair를 재정의해 줄 수 있다. 


보통 pair의 타입에 따라 int, char이면 pic, int, int이면 pii 이런식으로 지정하곤 한다.


재정의를 하게 되면 make_pair을 따로 쓰지 않고 pic(1,'a')처럼 이용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdio>
#include <utility>
#include <vector>
 
using namespace std;
 
typedef pair<intchar> pic;
 
vector<pic> vc;
 
int main()
{
    vc.push_back(pic(1,'a'));
    
    printf("%d %c", vc[0].first, vc[0].second);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus








pair을 조금 쉽게 설명하자면 구조체와 비유하자면 아래 구조체와 같은 방식을 이루고 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstdio>
 
using namespace std;
 
template<typename T1, typename T2>
struct PAIR
{
    T1 first;
    T2 second;
};
 
int main()
{
    PAIR<intchar> p;
 
    p.first = 1;
    p.second = 'a';
 
    printf("%d %c", p.first, p.second);
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


template<typename T>와 T first, T second의 의미는


template를 통해 int, char 등등 다양한 타입이 올 수 있도록 한 것이고,


선언 시 PAIR<int> p;라고 하여 p.first, p.second를 나타낼 수 있게 된다.


이와 같이 pair는 따로 코더가 작성하지 않고 편리하게 2가지 자료형을 묶어 이용할 수 있는 좋은 STL이다.



참고로 pair을 sort 함수를 이용하여 정렬 할 때는(따로 정렬 방식을 지정해주지 않는 경우)


항상 first를 기준으로 우선 정렬하고, 그다음 first가 같을 경우 second를 기준으로 오름차순 정렬을 하게 된다.



반응형