[C++] vector 컨테이너 정렬

50988 단어 cppcpp

참고 자료
https://hydroponicglass.tistory.com/33
https://www.geeksforgeeks.org/sorting-vector-of-pairs-in-c-set-1-sort-by-first-and-second/


vector 컨테이너의 원소가 pair와 구조체일 때, 정렬 기준을 바꾸는 방법을 알아보자.

1. pair를 담는 vector 컨테이너

#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

first 기준으로 정렬

기본적으로 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

second 기준으로 정렬

#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

first가 같으면 second 기준으로 정렬

기본적으로 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

2. 구조체를 담는 vector 컨테이너

#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

좋은 웹페이지 즐겨찾기