[C++ STL] Pair Container 사용법 정리 (With Vector, Typedef, Sort)

반응형
반응형

#1 Pair 정의 & 사용방법

#2 Pair 멤버함수

- p.first

- p.second

- make_pair(v1,v2)

#3 Pair 사용예제

- Pair & vector

- Pair & typedef

- Pair & sort (first 기준 정렬, second 기준 정렬)

 

다음 글은 개인적인 공부내용을 정리하기 위해 작성된 것으로 잘못된 내용이 있을 수 있습니다. :)

추가하거나 잘못된 내용이 있다면 지속적으로 수정해 나갈 예정입니다.

벡터 컨테이너에 대한 이해가 부족하시다면 다음 포스팅을 읽고 와주세요. VECTOR


#1 Pair 정의 & 사용방법

■ Pair 정의

Pair는 두개의 객체(first, second)를 하나로 묶어주는 역할을 하는 struct로 데이터의 쌍을 표현할 때 사용한다.

주로 벡터와 묶어 이차원 배열처럼 사용하거나, 좌표계를 표현할 때 사용되곤 한다.

 

■ Pair 사용방법

① #include <utility> - 유틸리티 헤더를 선언 한다.

② pair<[type first], [type second]> p_name - 사용할 데이터타입 두 가지를 넣어 주고, pair의 이름을 선언한다.

pair는 초기에 따로 초기화하지 않으며, make_pair 멤버함수를 사용해 필요할 때 마다 원소를 넣어주는 방식으로 사용한다.

 

#2 Pair 멤버함수

p.first - p의 첫 번째 인자를 반환한다.

② p.second - p의 두 번째 인자를 반환한다.

③ make_pair(value1, value2) - value1, value2를 가진 pair를 생성한다.

* operator (==, !=, < , <= , >, >=) 를 통한 비교연산이 가능하다.

* algorithm stl - sort 를 통한 정렬이 가능하다.

#include <iostream>
#include <utility>
using namespace std;

int main()
{
	pair<int,int> p1; // <int,int> 타입 페어 생성  
	p1 = make_pair(10,20); // (10,20) 페어 추가
	cout << "<int,int> p1 \n";
	cout << p1.first << endl; // 첫 번째 원소 (10) 출력
	cout << p1.second << endl; // 두 번째 원소 (20) 출력 
	
	cout << "<int,stirng> p2 \n";
	pair<int,string> p2; // <int,string> 타입 페어 생성
	p2 = make_pair(100,"Hello"); // <100,"Hello") 페어 추가
	cout << p2.first << endl; // 첫 번째 원소 (100) 출력
	cout << p2.second << endl; // 두 번째 원소 ("Hello") 출력 
	return 0;
}
[출력결과]
<int,int> p1
10
20
<int,stirng> p2
100
Hello

 

#3 Pair 사용예제

■ pair & vector

pair와 vector 컨테이너를 같이 사용한 예제이다.

#include <iostream>
#include <vector>
#include <utility>
using namespace std;

int main()
{
	vector<pair<int,int>> v;
	
	v.push_back(make_pair(10,20));
	v.push_back(make_pair(30,40));
	v.push_back(make_pair(50,60));
	
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	return 0;
}
[출력결과]
10 20
30 40
50 60

 

■ pair & typedef

typedef 문법을 이용해서, pair를 간략하게 표현 가능하다.

앞의 vector 예제에서 pair 부분만 typedef로 바꾸어 선언한 예제이다. (출력 결과는 동일하다.)

#include <iostream>
#include <vector>
#include <utility>
using namespace std;

typedef pair<int,int> P; // typedef pair

int main()
{
	vector<P> v;
	
	v.push_back(make_pair(10,20));
	v.push_back(make_pair(30,40));
	v.push_back(make_pair(50,60));
	
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	return 0;
}

 

■ pair & sort

pair는 algorithm의 sort를 이용해 정렬이 가능하다. sort의 세 번째 인덱스를 따로 지정해 주지 않으면, first 를 기준으로 정렬하고 비교함수를 구현해서 second 기준으로 정렬하는 것도 가능하다.

 

- first 기준 정렬

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;

typedef pair<int,int> P;

int main()
{
	vector<P> v;
	v.push_back(make_pair(10,20));
	v.push_back(make_pair(50,40));
	v.push_back(make_pair(30,60));
	
	cout << "[Before Sort]" << endl; 
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	
	sort(v.begin(), v.end()); // first 기준 정렬
	
	cout << "[After Sort] First 기준 정렬" << endl; 
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	return 0;
}
[Before Sort]
10 20
50 40
30 60
[After Sort] First 기준 정렬
10 20
30 60
50 40

 

- second 기준 정렬

내림차순 정렬은, compare 함수에서 부등호 방향을 반대로 바꿔주면 된다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;

typedef pair<int,int> P;

bool compare(P x, P y)
{
	return x.second < y.second;
}
 
int main()
{
	vector<P> v;
	v.push_back(make_pair(10,20));
	v.push_back(make_pair(50,10));
	v.push_back(make_pair(30,60));
	
	cout << "[Before Sort]" << endl; 
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	
	sort(v.begin(), v.end(), compare);
	
	cout << "[After Sort] Second 기준 정렬" << endl; 
	cout << v[0].first << " " << v[0].second << endl;
	cout << v[1].first << " " << v[1].second << endl;
	cout << v[2].first << " " << v[2].second << endl;
	return 0;
}
[Before Sort]
10 20
50 10
30 60
[After Sort] Second 기준 정렬
50 10
10 20
30 60
반응형

댓글

Designed by JB FACTORY