참고 자료
https://hydroponicglass.tistory.com/33
https://www.geeksforgeeks.org/sorting-vector-of-pairs-in-c-set-1-sort-by-first-and-second/
vector 컨테이너의 원소가 pair와 구조체일 때, 정렬 기준을 바꾸는 방법을 알아보자.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// pair를 담는 vector 선언
vector<pair<int, int>> v;
int arr[] = { 10, 20, 5, 40 };
int arr1[] = { 30, 60, 20, 50 };
int n = sizeof(arr) / sizeof(arr[0]);
// 배열의 원소 값으로 pair 초기화
for (int i = 0; i < n; i++)
v.push_back(make_pair(arr[i], arr1[i]));
// 벡터의 원소 출력
for (int i = 0; i < n; i++){
cout << v[i].first << " " << v[i].second << endl;
}
return 0;
}
10 30
20 60
5 20
40 50
기본적으로 algorithm 헤더파일에 있는 sort 함수는 pair의 first를 기준으로 vector의 원소들을 오름차순 정렬한다.
#include <iostream>
#include <vector>
#include <algorithm> // sort
using namespace std;
int main()
{
// pair를 원소로 하는 벡터 선언
vector<pair<int, int>> v;
int arr[] = { 10, 20, 5, 40 };
int arr1[] = { 30, 60, 20, 50 };
int n = sizeof(arr) / sizeof(arr[0]);
// 배열의 원소 값으로 pair 초기화
for (int i = 0; i < n; i++)
v.push_back(make_pair(arr[i], arr1[i]));
// 정렬 전
cout << "The vector before sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
// pair의 first를 기준으로 오름차순 정렬
//sort(v.begin(), v.end(), less<>());
sort(v.begin(), v.end());
// 정렬 후
cout << "The vector after sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
return 0;
}
The vector before sort operation is:
10 30
20 60
5 20
40 50
The vector after sort operation is:
5 20
10 30
20 60
40 50
내림차순으로 정렬하려면 sort 함수의 세 번째 인자를 greater<>()
로 바꿔주면 된다.
sort(v.begin(), v.end(), less<>()); // 오름차순
sort(v.begin(), v.end(), greater<>()); // 내림차순
The vector before sort operation is:
10 30
20 60
5 20
40 50
The vector after sort operation is:
40 50
20 60
10 30
5 20
#include <iostream>
#include <vector>
#include <algorithm> // sort
using namespace std;
// pair의 second를 기준으로 정렬
bool compare(const pair<int, int>& a, const pair<int, int>& b){
// a가 b보다 작으면 true여서 스왑X
return (a.second < b.second); // 오름차순
//return (a.second > b.second); // 내림차순
}
int main()
{
// pair를 원소로 하는 벡터 선언
vector<pair<int, int>> v;
int arr[] = { 10, 20, 5, 40 };
int arr1[] = { 30, 60, 20, 50 };
int n = sizeof(arr) / sizeof(arr[0]);
// 배열의 원소 값으로 pair 초기화
for (int i = 0; i < n; i++)
v.push_back(make_pair(arr[i], arr1[i]));
// 정렬 전
cout << "The vector before sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
// pair의 second를 기준으로 정렬
sort(v.begin(), v.end(), compare);
// 정렬 후
cout << "The vector after sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
return 0;
}
second를 기준으로 오름차순 정렬한 결과
5 20
10 30
40 50
20 60
second를 기준으로 내림차순 정렬한 결과
20 60
40 50
10 30
5 20
기본적으로 sort 함수는 first가 같으면 second를 기준으로 오름차순 정렬한다.
#include <iostream>
#include <vector>
#include <algorithm> // sort
using namespace std;
int main()
{
// pair를 원소로 하는 벡터 선언
vector<pair<int, int>> v;
int arr[] = { 10, 20, 20, 50, 40, 10 };
int arr1[] = { 40, 60, 10, 20, 50, 30 };
int n = sizeof(arr) / sizeof(arr[0]);
// 배열의 원소 값으로 pair 초기화
for (int i = 0; i < n; i++)
v.push_back(make_pair(arr[i], arr1[i]));
// 정렬 전
cout << "The vector before sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
// first가 같으면 second를 기준으로 오름차순 정렬
sort(v.begin(), v.end());
// 정렬 후
cout << "The vector after sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
return 0;
}
The vector before sort operation is:
10 40
20 60
20 10
50 20
40 50
10 30
The vector after sort operation is:
10 30
10 40
20 10
20 60
40 50
50 20
compare 함수를 정의해서 원하는대로 정렬 기준을 바꿀 수 있다.
#include <iostream>
#include <vector>
#include <algorithm> // sort
using namespace std;
// first 기준으로 '내림차순' 정렬
// first가 같으면 second를 기준으로 '오름차순' 정렬
bool compare(const pair<int, int>& a, const pair<int, int>& b){
if (a.first == b.first) {
return (a.second < b.second);
}
return (a.first > b.first);
}
int main()
{
// pair를 원소로 하는 벡터 선언
vector<pair<int, int>> v;
int arr[] = { 10, 20, 20, 50, 40, 10 };
int arr1[] = { 40, 60, 10, 20, 50, 30 };
int n = sizeof(arr) / sizeof(arr[0]);
// 배열의 원소 값으로 pair 초기화
for (int i = 0; i < n; i++)
v.push_back(make_pair(arr[i], arr1[i]));
// 정렬 전
cout << "The vector before sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
sort(v.begin(), v.end(), compare);
// 정렬 후
cout << "The vector after sort operation is:\n";
for (int i = 0; i < n; i++){
cout << v[i].first << " "
<< v[i].second << endl;
}
return 0;
}
The vector before sort operation is:
10 40
20 60
20 10
50 20
40 50
10 30
The vector after sort operation is:
50 20
40 50
20 10
20 60
10 30
10 40
#include <iostream>
#include <vector>
#include <algorithm> // sort
#include <string>
using namespace std;
struct Student {
string name;
int age;
int score;
};
// 기본은 점수를 기준으로 오름차순 정렬
// 점수가 같으면, 나이를 기준으로 오름차순 정렬
bool compare(const Student& a, const Student& b){
if (a.score == b.score) {
return (a.age < b.age);
}
return (a.score < b.score);
}
int main()
{
// Student를 원소로 하는 벡터 선언
vector<Student> v;
v.push_back({ "김", 24, 80 });
v.push_back({ "이", 19, 50 });
v.push_back({ "박", 30, 80 });
v.push_back({ "최", 21, 40 });
v.push_back({ "정", 23, 70 });
cout << "The vector before sort operation is:\n";
for (int i = 0; i < v.size(); i++){
cout << v[i].name << " " << v[i].age << " " << v[i].score << "\n";
}
sort(v.begin(), v.end(), compare);
cout << "The vector after sort operation is:\n";
for (int i = 0; i < v.size(); i++) {
cout << v[i].name << " " << v[i].age << " " << v[i].score << "\n";
}
return 0;
}
The vector before sort operation is:
김 24 80
이 19 50
박 30 80
최 21 40
정 23 70
The vector after sort operation is:
최 21 40
이 19 50
정 23 70
김 24 80
박 30 80