벡터든 배열이든 정렬을 하려면 <algorithm> 라이브러리의 sort() 함수를 쓰면 된다. 따라서 <algorithm> 헤더파일을 포함해줘야 한다.
sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다.
배열의 경우 (배열의 크기가 10인 경우)
sort(arr, arr + 10);
벡터의 경우
sort(v.begin(), v.end());
이렇게 하면 된다.
첫 번째 인자로는
정렬하고 싶은 데이터 집합이 배열이라면 배열의 이름을 넘겨주면 되고 (배열의 이름은 포인터니까)
벡터라면 v.begin()을 넘겨주면 된다. (벡터에서 v.begin()을 하면 벡터의 시작 주소를 반환한다.)
두 번째 인자로는
정렬하고 싶은 데이터 집합이 배열이라면 배열의 이름 + 배열의 크기을 넘겨주면 되고
벡터라면 v.begin()을 넘겨주면 된다. (벡터에서 v.end()을 하면 벡터의 마지막 주소를 반환한다.)
이렇게 매개변수 두 개를 모두 넣어주고 sort() 함수를 호출하면 오름차순으로 정렬된다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 4, 7, 2, 5, 10, 8, 1, 6, 3 };
cout << "정렬 전: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
sort(v.begin(), v.end());
cout << "정렬 후: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
이 코드의 실행 결과는 다음과 같다.
sort() 함수 호출 이후에는 오름차순으로 정렬되어 있는 것을 볼 수 있다.
배열로 해도 마찬가지이다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[10] = { 9, 4, 7, 2, 5, 10, 8, 1, 6, 3 };
cout << "정렬 전: ";
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
cout << endl;
sort(arr, arr + 10);
cout << "정렬 후: ";
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
이 코드를 실행해도
배열의 원소들이 오름차순으로 정렬된 것을 볼 수 있다.
벡터를 정렬하려면 sort(v.begin(), v.end());이고
배열을 정렬하려면 sort(arr, arr + 10);라는 것 기억하자.
벡터를 내림차순으로 정렬하고 싶다면 sort(v.begin(), v.end()); 대신에 sort(v.rbegin(), v.rend());를 쓰면 된다.
sort(v.rbegin(), v.rend());
그런데 오름차순이 아니라 내가 원하는 정렬 기준을 세워서 정렬하고 싶다면? 정렬하고 싶은 대상이 기초 타입이 아니라면?
sort() 함수의 세 번째 인자로 비교기준이 되는 함수포인터 또는 함수 객체를 넣어주면 된다.
그 함수는 반환타입이 bool 타입이어야 하고 매개변수는 두 개이며 두 매개변수의 타입은 정렬할 데이터의 타입과 일치해야 한다.
내림차순으로 정렬하고 싶다면 compare 함수를 이렇게 만들면 된다.
bool cmp(int a, int b) {
return a > b;
}
이 cmp 함수를 sort() 함수의 3번째 인자로 넣어서 아래 코드를 실행하면
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main() {
vector<int> v = { 4, 7, 2, 5, 10, 8, 1, 6, 3 };
cout << "정렬 전: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
sort(v.begin(), v.end(), cmp);
cout << "정렬 후: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
이렇게 내림차순으로 정렬된 것을 볼 수 있다.
배열을 정렬할 때에도 똑같이 하면 된다.
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main() {
int arr[10] = { 9, 4, 7, 2, 5, 10, 8, 1, 6, 3 };
cout << "정렬 전: ";
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
cout << endl;
sort(arr, arr + 10, cmp);
cout << "정렬 후: ";
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
이렇게 배열과 벡터를 정렬하는 방법을 배워보았다.
만약에 정렬하고 싶은 자료들의 타입이 기초타입이 아니라 내가 정의한 클래스라고 해도 compare 함수만 구현해서 sort 함수의 인자로 넣어준다면 나만의 기준으로 정렬할 수 있다.
'C++' 카테고리의 다른 글
[C++] <vector> 라이브러리, 벡터 클래스, 동적 할당 (0) | 2020.02.06 |
---|---|
[C++] <queue> 라이브러리, 우선순위 큐, 최대 힙, 최소 힙 (3) | 2020.02.04 |
[C++] <set> 라이브러리, set 사용법 (0) | 2020.01.30 |
[C++] <tuple> 라이브러리 - tuple, pair (0) | 2020.01.30 |
[C++] 포인터 사용 시 주의 사항 (0) | 2020.01.30 |