정렬(sort) - compare
C++에서 자주 쓰이는 기능 중, <algorithm> 헤더 안에 있는 sort 기능이 많이 쓰인다.
해당 함수는 벡터(vector)나 배열과 함께 사용한다.
아래는 사용법 예시이다.
#include <iostream>
#include <algorithm> // sort 헤더파일
#include <vector> // 벡터 헤더파일
using namespace std;
int array_size = 8;
int main(){
int array[] = {4,5,2,1,5,1,74,5};
vector<int> arr = {4,5,2,1,5,1,74,5};
sort(arr.begin(),arr.end());
sort(array,array+array_size,greater<int>());
for(int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
for(int i = 0; i < array_size; i++) {
cout << array[i] << " ";
}
/* 출력
1 1 2 4 5 5 5 74
74 5 5 5 4 2 1 1
*/
}
greater이나 less 이런 걸 사용해서 오름차순과 내림차순을 나타내기도 한다.
핵심적으로 다룰 것은 오름차순 내림차순 같은 정렬 규칙을 직접 정의하는 방법에 관한 것이다.
방법 자체는 간단하다.
위에 greater <int> 자리 부분에 사용자 정의 함수를 만들어주면 된다.
사용자 정의 함수는 bool 형으로 만들어주고, 매개변수로는 원하는 자료형을 넣어주면 된다.
아래에 예시를 보자.
bool compare(int a, int b){
if(a.count == b.count) return (a.num < b.num);
return a.count < b.count;
}
int main(){
vector<int> tmp;
sort(tmp.begin(),tmp.end(),compare);
}
위 같은 방식으로 해주면 된다.
매개변수는 같은 자료형의 변수 두 가지가 들어간다.
compare이라는 bool형인 이유는 true 또는 false를 반환하여
우선순위 관계를 정의하기 위해서이다.
return값에 대해서 말하면 간단하게
a < b : a보다 b가 더 크다.
→ a보다 b가 더 뒤에 나온다.( 오름차순 )
a > b : b보다 a가 더 크다.
→ b보다 a가 더 뒤에 나온다.( 내림차순 )
쉽게 말해서 큰 쪽이 우선순위가 뒤로 밀린다.(뒤에 나온다).
이런 사용자정의가 왜 필요할까?
구조체나, 내부가 복잡한 자료형을 사용할 경우에 필요하기 때문이다.
struct Number{
int num;
int count;
};
당장 구조체 Number가 존재하고 안에 2가지 변수가 있다.
나는 여기서 count를 기준으로 오름차순 정렬하고 싶은데,
그냥 오름차순 정렬했다간 num을 기준으로 오름차순 할 수도 있다.
다른 경우로 count를 기준으론 내림차순 정렬하고 싶을 수도 있다.
그렇기 때문에 해당 기능이 필요한 것이다.
이런 경우 아래와 같이 사용하면 된다.
bool compare(Number a, Number b){
if(a.count == b.count) return (a.num < b.num);
return a.count < b.count;
}
이는 예외적인 처리까지 해준 것인데, 내부에서도 우선순위가 존재한다.
count가 num보다 우선순위이다.
count에 대해서는 오름차순이고,count가 서로 같을 때 num에 대해 비교한다.
이런 식으로 사용하면 된다.