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 이상), 일반 함수 또는 함수 포인터 전달, 그리고 < 연산자 오버로딩입니다. 상황과 코드 스타일에 맞는 방법을 선택해 활용하면 됩니다.