Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL std::sort로 사용자 정의 객체 벡터 정렬하기

C++에서는 STL에서 제공하는 std::sort 함수를 사용해 사용자 정의 객체(custom object)로 이루어진 벡터를 손쉽게 정렬할 수 있습니다. std::sort는 오버로드된 형태 중 하나로 (first, last, comparator) 세 가지 인자를 받는 버전을 제공합니다.

  • first: 정렬할 범위의 첫 번째 요소를 가리키는 반복자(iterator)
  • last: 정렬할 범위의 마지막 다음 요소를 가리키는 반복자
  • comparator: 컨테이너를 어떤 기준으로 정렬할지 결정하는 술어(predicate) 함수

예제 코드

다음은 C++11의 람다 표현식(lambda expression)을 사용해 구조체 벡터를 key 값 기준으로 오름차순 정렬하는 예제입니다.

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

using namespace std;

struct MyStruct {
    int key;
    string data;
    MyStruct(int key, string data) {
        this->key = key;
        this->data = data;
    }
};

int main() {
    std::vector<MyStruct> vec;
    vec.push_back(MyStruct(4, "test"));
    vec.push_back(MyStruct(2, "is"));
    vec.push_back(MyStruct(3, "a"));
    vec.push_back(MyStruct(1, "this"));

    // C++11 람다 표현식 사용
    sort(vec.begin(), vec.end(), [](const MyStruct& lhs, const MyStruct& rhs) {
        return lhs.key < rhs.key;
    });

    for(auto it = vec.begin(); it != vec.end(); it++) {
        cout << it->data << endl;
    }
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 나타납니다.

this is a test

구버전 C++에서 정렬하는 방법

C++11 이전 버전을 사용하는 환경이라면 람다 표현식 대신 함수 포인터(함수 참조)를 전달하는 방식으로 동일한 결과를 얻을 수 있습니다.

// 비교 함수 정의
bool comparator(const MyStruct& lhs, const MyStruct& rhs) {
    return lhs.key < rhs.key;
}

// sort에 함수 전달
sort(vec.begin(), vec.end(), &comparator);

< 연산자 오버로딩 활용하기

또 하나의 방법은 클래스나 구조체 내부에서 < 연산자를 직접 오버로드하는 것입니다. 연산자를 오버로드하면 별도의 비교 함수 없이 sort(first, last) 형태만으로 정렬이 가능하며, 정렬 시 자동으로 해당 연산자가 요소 간 비교에 사용됩니다.

struct MyStruct {
    int key;
    string data;
    MyStruct(int key, string data) : key(key), data(data) {}

    // < 연산자 오버로드
    bool operator<(const MyStruct& other) const {
        return key < other.key;
    }
};

// comparator 없이 바로 정렬 가능
sort(vec.begin(), vec.end());

정리하면, C++에서 사용자 정의 객체 벡터를 정렬하는 대표적인 방법은 세 가지입니다. 람다 표현식 사용(C++11 이상), 일반 함수 또는 함수 포인터 전달, 그리고 < 연산자 오버로딩입니다. 상황과 코드 스타일에 맞는 방법을 선택해 활용하면 됩니다.