C++ [STL] sort()
C++ STL sort()
정렬은 이미 C++ library에 구현되어있음
Defined in header algorithm
C++ 기본 정렬 라이브러리는 기본적으로 인덱스 순서대로 오름차순으로 정렬
template< class RandomIt, class Compare >
constexpr void sort( RandomIt first, RandomIt last, Compare comp );
- first, last - 정렬할 요소의 범위
- comp - comparison function
sort(RandomIt first, RandomIt last)
- sort()함수는 기본적으로 오름차순 정렬을 수행
- 배열의 시작점 주소와 마지막 주소를 sort()함수 내부에 입력
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[10] = {9,5,4,3,2,1,6,7,10,8};
sort(a, a+10);
for(int i = 0; i <10; ++i)
{
cout << a[i] << " ";
}
}
- sort(a, a+10);
- a: 배열 이름은 배열의 첫번째 주소를 의미
- a+10 : 배열의 첫 번째 주소 + 10 (즉, last 데이터를 가리킴)
sort(RandomIt first, RandomIt last, Compare comp)
sort() 함수의 강력한 점은 우리가 정렬하고 싶은 기준을 우리가 직접 설정할 수 있다는 것
comp() 함수를 만들어서 sort()함수의 세번 째 인자 값으로 입력
comp() 함수의 동작에 맞게 정렬이 동작
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a, int b)
{
return a > b;
}
int main()
{
int a[10] = {9,5,4,3,2,1,6,7,10,8};
sort(a, a+10, compare);
for(int i = 0; i <10; ++i)
{
cout << a[i] << " ";
}
}
Sort the Object
#include <iostream>
#include <algorithm>
using namespace std;
class Student
{
public:
string name;
int score;
Student(string name, int score) //Constructor to initilize
{
this->name = name;
this->score = score;
}
bool operator < (Student &student)
{
return this->score < student.score;
}
};
int main()
{
Student students[] = {
Student("Monica", 97),
Student("Rachel", 89),
Student("Pheebs", 92)
};
sort(students, students+3);
for(int i = 0; i <3; i++)
{
cout << students[i].name << " ";
cout << students[i].score <<endl;
}
}
- bool operator < (Student &student)
- 연산자 오버로딩하여 sort내부에서 정렬을 하게 될 때 “ < “ 연산자를 쓸 테니까 필요한 경우 재정의
- return this->score < student.score;
- 다른 사람 (student)와 비교를 할 때 내점수 this.score이 낮다면 true를 return
- c언어에서는 내부변수에 접근하기 위해서 기본적으로 화살표를 이용
Sort the data in Vector using pair
C++ 라이브러리 벡터와 pair를 활용한 정렬
벡터: 연결리스트 형태로 되어있는 vector라이브러리
(1) 단일 pair
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<pair<int, string>> v;
v.push_back(pair<int, string>(90,"Alex"));
v.push_back(pair<int, string>(85,"Tom"));
v.push_back(pair<int, string>(82,"Bread"));
v.push_back(pair<int, string>(98,"Jonny"));
v.push_back(pair<int, string>(79,"Luke"));
// sort(v, v+5); --> error
sort(v.begin(), v.end());
for(int i = 0; i < v.size(); ++i)
{
cout << v[i].second << " ";
cout << v[i].first <<endl;
}
}
- push_back : 리스트의 마지막 부분에 삽입
- v.size(): size() 현재 벡터의 크기를 리턴
- pair 는 선언된 이후로 first , second 값을 가질 수 있음
- 현재 선언된 pair의 second는 이름 정보를 의미
(2) 이중 pair
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<string, pair<int, int>> a,
pair<string, pair<int, int>> b)
{
if(a.second.first == b.second.first)
return a.second.second > b.second.second;
else
return a.second.first > b.second.first;
}
int main()
{
vector<pair<string, pair<int, int>>> v;
v.push_back(pair<string, pair<int, int>>("Alex", pair<int, int>(90, 19960504)));
v.push_back(pair<string, pair<int, int>>("Dave", pair<int, int>(87, 19940218)));
v.push_back(pair<string, pair<int, int>>("Andy", pair<int, int>(74, 19871214)));
v.push_back(pair<string, pair<int, int>>("Luke", pair<int, int>(98, 19980123)));
v.push_back(pair<string, pair<int, int>>("Clair", pair<int, int>(90, 19820612)));
sort(v.begin(), v.end(), compare);
for(int i = 0; i < v.size(); ++i)
{
cout << v[i].first << " ";
cout << v[i].second.first <<endl;
}
}