- 기본적인 정렬
int a[5] = { 5,2,1,4,3 };
sort(a, a+5);
- 벡터에 구조체 사용하여 정렬
기본적인 구조체의 모습은 아래와 같다. 점수, 랭크, 인덱스라고 보면 된다.
struct s {
int num;
int rank;
int idx;
};
벡터의 입력은 다음과 같이 받는다.
vector<s>v;
v.push_back({ 1,3,5 }); // num, rank, idx 순서
v.push_back({ 3,1,1 });
v.push_back({ 2,5,1 });
//sort(v.begin(), v.end()); // 이렇게 하면 오류
sort(v.begin(), v.end(), cmp_vector_struct);
주석처리한 부분이 오류가 나는 이유는 하나의 인덱스에 3개이상의 정보를 담고 있기 때문이다.
벡터의 자료형이 pair로 들어가 있을때는 오류가 안나는데, 그 이유는 c++에서 자동으로 2개의 원소가 담기면 앞의 원소(first)를 자동으로 기준으로 잡기 때문이다.
하지만 3개 이상의 경우 어떤걸 기준으로 잡고 정렬을 해야할 지 모르기 때문에, 사용자가 정렬의 기준이 담긴 함수를 매개변수에 추가해야한다.
비교 함수를 만들면 다음과 같다
bool cmp_vector_struct(const s& a, const s& b) { // 매개변수는 항상 이렇게 const는 포인터
// 여기서 어떤 구조체 변수를 기준으로 정렬할건지를 정함
if (a.idx < b.idx) {
return true;
}
else if (a.idx == b.idx) {
if (a.num < b.num) {
return true;
}
}
return false;
}
여기서 유의해야 할 점은 매개변수의 형태이다. const (자료형) &(변수명1), const (자료형) &(변수명2)와 같은 형태로 들어간다. 매개변수는 항상 2개가 들어가야 한다.
'Programming > C++' 카테고리의 다른 글
C++ 문자열 파싱, 비교 (0) | 2020.09.12 |
---|