C++ [STL] sort()

C++ STL sort()

std::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;
	}
}

Categories:

Updated: