Programming/C++

C++ STL 정리 - sort 함수

돌돌김 2019. 11. 28. 03:16
  • 기본적인 정렬
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