C++ STL에서 제공하는 set, map, multiset, multimap 등의 컨테이너는 자동으로 데이터를 정렬된 상태로 유지시켜 준다. 그래서 이러한 컨테이너에 데이터를 넣고 그대로 출력하기만 하면 오름차순으로 정렬된 데이터를 얻을 수 있지만 가끔은 내림차순 정렬이 필요하거나 내가 원하는 방식대로 정렬되어야 하는 경우도 생긴다.
set의 템플릿 (template)을 살펴보면 다음과 같이 되어 있다
template <class _Kty, class _Pr = less<_Kty>, class _Alloc = allocator<_Kty>>
_Kty 부분은 흔히 사용하는 키 타입을 설정하는 부분이다. 우리가 봐야 할 부분은 _Pr이다 기본 값으로 less가 설정된 모습을 볼 수 있는데 이 less는 아래와 같이 정의되어 있다
template <class _Ty = void>
struct less {
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type;
constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const {
return _Left < _Right;
}
};
less는 구조체 형태로 정의되어 있고 내부에는 operator() 형태로 연산자 오버로딩이 사용되고 있다. 또한 그 내용을 보면 _Left와 _Right의 크기를 비교해서 결과를 반환하고 있다. 이 less가 기본적으로 설정되어 있었기 때문에 오름차순으로 정렬되었던 것이기 때문에 정렬 기준을 바꾸기 위해선 저 _Pr 부분에 다른 코드를 넣어주면 된다. 단순 비교만 하는 경우 STL 자체에서 지원하는 greater, less, greater_equal, less_equal 등이 있다. 만약에 내림차순으로 정렬 기준을 바꾸고 싶은 경우 greater를 이용하면 된다.
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<string, greater<string>> s;
s.insert("apple");
s.insert("banana");
s.insert("melon");
for (const auto& str : s) {
cout << str << endl;
}
return 0;
}
melon
banana
apple
정렬 기준을 내가 원하는 대로 직접 만들어야 하는 경우도 있다. 그럴 땐 직접 비교용 구조체를 만들어서 사용하면 된다. 예를 들어 오름차순 정렬이지만 길이가 짧은 문자열을 우선해서 정렬해야 하는 경우
#include <iostream>
#include <set>
using namespace std;
// 직접 추가한 비교용 구조체
struct myOrder
{
bool operator() (const string& left, const string& right) const
{
if (left.size() == right.size()) {
return left < right;
}
else {
return left.size() < right.size();
}
}
};
int main()
{
set<string, myOrder> s;
s.insert("apple");
s.insert("banana");
s.insert("melon");
for (const auto& str : s) {
cout << str << endl;
}
return 0;
}
apple
melon
banana
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] cin.ignore와 버퍼에 대한 이해 (0) | 2024.12.02 |
---|---|
[C++] std::map을 value 기준으로 정렬하기 (0) | 2024.12.01 |
[C++] 문자열 뒤집는 방법 (0) | 2024.11.13 |
[C++] string to int, float, double 자료형 / stoi, stol, stoll (0) | 2024.09.23 |
[C++] C++ 17 표준 라이브러리의 알고리즘 병렬화 (0) | 2024.07.03 |