[C++] vector<pair<int, int>> 를 compare 함수 없이 정렬하면?

뚱이·2023년 9월 11일
0
post-thumbnail

vector<pair<int, int>> 를 compare 함수 없이 정렬하면?

vector<pair<int, int>> 를 별도의 compare 함수 없이 sort() 함수로 정렬하면 결과가 어떻게 나올까?

궁금해서 간단한 코드를 짜봤다.

Case 1.

vector<pair<int, int>> 함수 안에 (1, 10) ~ (10, 1)까지의 데이터를 넣어줬다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    // 입력
    vector<pair<int, int>> v;
    for (int i=1; i<=10; i++) {
        v.push_back({i, 11-i});
    }
    
    cout << "[정렬 전]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    // 연산 및 출력
    sort(v.begin(), v.end());
    
    cout << "---------\n";
    cout << "[정렬 후]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    return 0;
}

이 코드의 결과는 다음과 같이 나왔다.

이것만 보면 pair.first 를 기준으로 정렬이 되는 거 같다.

Case 2.

더 정확하게 확인해보기 위해 이번에는 데이터를 (10, 1) ~ (1, 10) 순서로 넣어줬다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    // 입력
    vector<pair<int, int>> v;
    for (int i=1; i<=10; i++) {
        v.push_back({11-i, i});
    }
    
    cout << "[정렬 전]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    // 연산 및 출력
    sort(v.begin(), v.end());
    
    cout << "---------\n";
    cout << "[정렬 후]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    return 0;
}

결과는 다음과 같았다.

앞에서 말한 것처럼 pair.fisrt 를 기준으로 정렬되는 듯 하다.

Case 3.

그렇다면 pair.first 의 값이 같은 상황에서는 어떻게 정렬이 될까 궁금해서 이것도 확인해봤다.

이번에는 vector에 (0, 10) ~ (0, 0)까지의 데이터를 넣어줬다.
순서는 일부러 내림차순으로 설정해줬다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    // 입력
    vector<pair<int, int>> v;
    for (int i=10; i>=0; i--) {
        v.push_back({0, i});
    }
    
    cout << "[정렬 전]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    // 연산 및 출력
    sort(v.begin(), v.end());
    
    cout << "---------\n";
    cout << "[정렬 후]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    return 0;
}

이번에도 정렬 전과 정렬 후, 모두 출력해줬는데

pair.second도 똑같이 오름차순으로 정렬된다.

Case 4.

마지막 테스트는 랜덤으로 값을 넣어줬다.

코드는 다음과 같다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    srand((unsigned int)time(NULL));    

    // 입력
    vector<pair<int, int>> v;
    for (int i=0; i<10; i++) {
        int n1 = rand() % 11;
        int n2 = rand() % 11;
        v.push_back({n1, n2});
    }
    
    cout << "[정렬 전]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    // 연산 및 출력
    sort(v.begin(), v.end());
    
    cout << "---------\n";
    cout << "[정렬 후]\n";
    for (pair<int, int> p : v) {
        cout << p.first << ", " << p.second << "\n";
    }
    
    return 0;
}

확인을 위해 이번에는 여러 번 코드를 돌려봤다.


결론

vector<pair<int, int>> 함수는 compare 함수를 별도로 작성하지 않으면, 모두가 예상했듯이,
첫 번째 원소를 먼저 오름차순 정렬하고, 그 후에 두 번째 원소를 오름차순 정렬한다.

테스트를 위해 int형으로만 코드를 짰는데, 다른 타입의 변수도 똑같이 적용된다.

0개의 댓글