C++ vector 정렬(sort) - 오름차순, 내림차순

Notepad96

·

2020. 11. 10. 19:20

300x250

 

 

 


1. 정렬(Sort)

 

C++ 에서는 STL algorithm 라이브러리에서 sort 함수를 지원해준다.

 

정렬 방식은 퀵 정렬로서 빠른 속도를 보장한다.

 

 

sort 함수는 일련의 반복자를 사용함으로 Set이나 Map 같은 컨테이너에서는 sort함수를 사용할 수는 없다.

 

 

 

 


2. 코 드

환경 : Visual studio 2019
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void print(vector<int> v) {
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << ' ';
	}
	cout << "\n";
}

// vector<pair<int, int>> 이기 때문에 인자 타입은 pair<int, int> 이 된다.
// vector<int>의 vector였다면 인자 타입은 int 가 된다.
bool desc(pair<int, int> a, pair<int, int> b) {
	// 각 원소들을 first에 관해서는 오름차순 정렬을, second에 관해서는 내림차순으로 정렬한다.
	if (a.first == b.first) return a.second > b.second;
	else return a.first < b.first;
}

int main() {
	vector<int> v;

	for (int i = 1; i < 11; i++) v.push_back(i);
	print(v);

	// 오름차순 정렬
	sort(v.begin(), v.end());



	// 내림차순 정렬
	// 1. reverse 반복자인 rbegin, rend 이용
	sort(v.rbegin(), v.rend());	


	// 2. greater를 사용하여서 내림차순. less는 오름차순
	sort(v.begin(), v.end(), greater<int>());


	// 3 람다 방식으로 작성(아래 함수로 임의 순으로 정렬 방식과 동일)
	sort(v.begin(), v.end(), [](int a, int b) {	
			return a > b;
		});
		
	print(v);


	
	vector<pair<int, int>> v2;
	v2.push_back(make_pair(5, 3));
	v2.push_back(make_pair(5, 1));
	v2.push_back(make_pair(4, 2));
	v2.push_back(make_pair(4, 8));

	// 함수로 임의 순으로 정렬. 이는 오름/내림차순뿐 아니라 임의로 순서를 지정해낼 수 있다.
	sort(v2.begin(), v2.end(), desc);

	for (int i = 0; i < v2.size(); i++) {
		cout << v2[i].first << ":" << v2[i].second << " ";
	}
	cout << "\n";

	return 0;
}
 
결과

 

- sort함수를 사용하기 위해서는 algorithm 라이브러를 추가해주어야 한다.

 
 

- 오름 차순으로 정렬하기 위해서는 sort 함수의 인수로 vector의 begin, end 반복자를 주면 된다.

 
 

- 정렬을 오름차순 혹은 내림차순이 아니라 특정한 기준에 따라 정렬을 하고 싶을 경우(예를 들어 문자열 vector을 문자열의 2번째 글자에 따라서 정렬) 정렬의 기준을 갖는 함수를 구현하여 정렬할 수 있다.

 
 

함수반환형은 bool이며

인자는 해당 vector의 제네릭 타입이다. (vector<pair<int,int>> 일 경우 pair<int, int> )

 
 

또한, 람다 방식을 사용하여서 함수를 선언하지 않고 바로 지정할 수 있다.

 
 
 
 


3. 참 조

 
 
 

sort - C++ Reference

custom (2)template void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

www.cplusplus.com

 
 
 
300x250