C++ Study
[C++ Reference] STL Set 정렬 함수 제작
잉숭
2021. 2. 14. 16:53
std::set
set 컨테이너는 연관 컨테이너 중 가장 간단한 컨테이너로 key라고 불리는 원소의 집합으로 이루어진 컨테이너이다
모든 연관 컨테이너는 균형 이진 트리로 구성된다. 따라서 set 컨테이너는 항상 정렬된 상태가 유지된다
기본 정렬 방식은 오름차순 방식이다 만약 내가 원하는 정렬 방식이 이와 다르다면 이를 변경할 수 있다
다음은 cpp reference에 정의된 std::set의 템플릿이다
template <class _Kty, class _Pr = less<_Kty>, class _Alloc = allocator<_Kty>>
첫 번째 파라미터 class_Kty는 키 타입을 설정하는 부분이고 두 번째 파라미터 class_Pr이 바로 우리가 찾는 부분이다
기본 값으로 less가 설정된 것을 볼 수 있는데 이는 다음과 같이 정의되어 있다
// STRUCT TEMPLATE less
template <class _Ty = void>
struct less {
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME;
constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const {
return _Left < _Right;
}
};
STL은 이외에도 greater, less_equal, greater_equal 구조체를 지원하니 단순 반복이 필요하다면 이를 사용하면 된다
set<int,less<int>> s1; // 오름차순 정렬 set (default 값)
set<int,less_equal<int>> s2; // 오름차순 정렬 set (작거나 같은 경우 앞에 온다)
set<int,greater<int>> s3; // 내림차순 정렬 set
set<int,greater_equal<int>> s4; // 내림차순 정렬 set (크거나 같은 경우 앞에 온다)
만약 나 자신만의 기준으로 정렬하고 싶을 경우 직접 구조체를 생성해야 한다
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();
}
};