신규 블로그를 만들었습니다!
STL sort() 함수
정렬을 만들어서 사용할 수 는 있지만,
매번 만들어서 사용하기는 번거롭다.
이럴때, 'alforithm' 을 include해서 그안에 있는 sort() 함수를 사용하면 된다.
1. sort() 함수를 이용한 오름차순과 내림차순
#include <iostream>
#include <algorithm>
using namespace std;
bool desc(int a, int b){
return a > b;
}
int main(void){
// sort()를 사용하기 위해 algorithm을 include 한다.
int data[10] = {9, 3, 5, 7, 8, 1, 2, 4, 6, 10};
sort(data, data+10); // 배열과 마지막원소를 넣어준다.
for(int i=0; i<10; i++){
cout << data[i] << ' ';
}
cout << endl;
// greater 함수를 이용해서 내림차순으로 표현할 수 있다.
sort(data, data+10, desc);
for(int i=0; i<10; i++){
cout << data[i] << ' ';
}
return 0;
}
sort(배열의 처음원소, 배열의 마지막 원소);
sort()는 기본적으로 오름차순으로 정렬을 해준다.
만약 내림차순으로 정렬을 하고 싶다면,
내림차순으로 해주는 함수를 정의하고 sort() 함수의 마지막 인자로 넣어주면 된다.
위의 코드를 보면
bool desc(int a, int b){
return a > b;
}
desc라는 임의의 함수를 만들었다.
int형 변수 2개를 비교해서, a>b의 결과를 반환한다.
sort(data, data+10, desc);
위와 같이 마지막 원소로 내가 만든 함수를 넣어준다.
그러면, sort는 내림차순으로 정렬을 해준다.
반환값을 a<b로 한다면, 오름차순이 되겠지만
기본적으로 오름차순으로 정렬해주기 때문에, 굳이 할 필요가 없다.
2. sort()를 이용하여 학생점수 오름차순으로 나열하기
// 학생들을 점수가 낮은 학생부터 나열하기
#include <iostream>
#include <algorithm>
using namespace std;
class Student{
public:
string name;
int score;
//constructor
Student(string name, int score){
this->name = name;
this->score = score;
}
// operator '<' overloading
bool operator <(Student &student){
return this->score < student.score;
}
};
int main(void){
Student students[] ={
Student("모모", 99),
Student("쯔위", 79),
Student("미나", 80),
Student("사나", 88),
Student("나연", 92),
Student("지효", 84),
Student("다현", 97),
Student("채영", 82),
Student("정연", 90)
};
sort(students, students + 9);
for(int i=0; i<9; i++){
cout << students[i].name << " : " << students[i].score << endl;
}
return 0;
}
'Student'라는 class를 만들어서, 그안에 필드값으로 이름과 점수를 넣는다.
그리고, constructor를 설정하고
연산자 오버로딩을 통해 오름차순으로 정렬될 것을 정의한다.
// operator '<' overloading
bool operator <(Student &student){
return this->score < student.score;
}
sort(배열의 첫번째 원소, 배열의 마지막 원소);
위와 같이 인자를 받기 때문에,
sort(students, students+9); 로 작성한다.
출력을 해보자
반대로 내림차순으로 하고 싶다면,
// operator '<' overloading
bool operator <(Student &student){
return this->score > student.score;
}
보기는 안좋지만,
반환값에서 부호를 반대방향으로 바꿔주면 된다.
3. 클래스를 이용하지않고, pair를 이용해서 나열하기
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(void){
// 클래스를 사용하지 않고 사용하는 방법
// pair 라이브러리 사용
vector<pair<int, string> > v; // int, string 으로 묶어서 사용
v.push_back(pair<int, string>(99, "모모"));
v.push_back(pair<int, string>(79, "쯔위"));
v.push_back(pair<int, string>(80, "미나"));
v.push_back(pair<int, string>(88, "사나"));
v.push_back(pair<int, string>(92, "나연"));
v.push_back(pair<int, string>(84, "지효"));
v.push_back(pair<int, string>(97, "다현"));
v.push_back(pair<int, string>(82, "채영"));
v.push_back(pair<int, string>(90, "정연"));
sort(v.begin(), v.end());
for(int i=0; i< v.size(); i++){
cout << v[i].second << ':' << v[i].first << endl;
}
return 0;
}
2번 예제에서는 class를 이용했지만,
class를 선언해서 사용하기 귀찮다면
vector, pair를 이용해서 나열할 수 있다.
4. 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(void){
vector<pair<string, pair<int, int> > > v;
v.push_back(pair<string, pair<int, int> > ("아이린", make_pair(90, 19910329)));
v.push_back(pair<string, pair<int, int> > ("예리", make_pair(98, 19990305)));
v.push_back(pair<string, pair<int, int> > ("슬기", make_pair(92, 19940210)));
v.push_back(pair<string, pair<int, int> > ("조이", make_pair(94, 19960903)));
v.push_back(pair<string, pair<int, int> > ("웬디", make_pair(94, 19940221)));
sort(v.begin(), v.end(), compare);
for(int i=0; i<5; i++){
cout << v[i].first << '(' << v[i].second.second;
cout << "):" << v[i].second.first << endl;
}
return 0;
}
점수를 내림차순으로 정렬한다.
점수가 동일한경우, 나이가 어린 학생부터 정렬한다.
정렬 알고리즘이 궁금하다면 아래 참조
관련 글
2018/04/28 - [Algorithm] - 자료구조 :: 선택정렬 Selection sort (c/c++ 구현)
2018/04/28 - [Algorithm] - 자료구조 :: 버블정렬 Bubble sort (c/c++ 구현)
2018/04/28 - [Algorithm] - 자료구조 :: 삽입정렬 Insertion sort (c/c++ 구현)
2018/04/28 - [Algorithm] - 자료구조 :: 퀵 정렬 Quick sort (c/c++ 구현)
2018/04/29 - [Algorithm] - 자료구조 :: 병합정렬 Merge sort (c/c++ 구현)
'Language > C&C++' 카테고리의 다른 글
C/C++ :: 3X3 퍼즐 게임 프로그램 만들기(코드 구현) (4) | 2018.06.05 |
---|---|
C++ :: 연산자 (사칙 연산자, 관계 연산자, 논리 연산자) (0) | 2018.03.02 |
C++ :: 야구 게임(Baseball) 프로그램 만들기 (1) | 2018.02.22 |
C++ :: 간단한 로또 프로그램 만들기! (1) | 2018.02.22 |
C++ :: 함수를 이용한 변수 초기화 방법 #4 (0) | 2018.02.18 |
최근댓글