새소식

컴퓨터공학 💻/C++

[C++프로그래밍] STL sort, vector, pair 활용하기

  • -
STL sort() 함수 활용하기

 

STL이란 C++의 표준 템플릿 라이브러리(Standard Template Libirary)의 약자로써 C++프로그래밍을 위해 제공되는 기본 내장 라이브러리입니다. STL에는 기본 4가지 구성요소로 알고리즘, 컨테이너, 함수자, 반복자를 제공합니다.

 

그중에서 알고리즘 <algorithm> 헤더에서 제공하는 sort() 함수에 대한 활용 방법입니다.

 

#include <iostream>
#include <algorithm> // sort() 함수 사용을 위한 라이브러리
using namespace std;

int main() {
	int a[8] = { 2, 4, 11, 8, 5, 9, 1, 13 };
	sort(a, a + 8);
	for (int i = 0; i < 8; i++)
		cout << a[i] << " ";
}
// 1 2 4 5 8 9 11 13

위와 같이 C++ 내장 라이브러리 중 <algorithm> 헤더안의 sort() 함수를 사용하면 별도의 알고리즘 작성없이 간편하게 정렬할 수 있습니다. sort() 함수의 인자로는 배열의 시작점 주소, 끝점 주소를 넣습니다. 즉, 배열의 시작점부터 끝점까지 정렬을 하겠다는 의미입니다. 

 

#include <iostream>
#include <algorithm>
using namespace std;

bool fn(int a, int b) {
	return a < b;
}
int main() {
	int a[8] = { 2, 4, 11, 8, 5, 9, 1, 13 };
	sort(a, a + 8, fn);
	for (int i = 0; i < 8; i++)
		cout << a[i] << " ";
}
// 1 2 4 5 8 9 11 13

이번에는 sort() 함수에 정렬 기준을 제공하는 함수까지 같이 매개변수로 넣어보겠습니다.

fn() 함수의 함수값은 a[] 배열이 정렬되는 기준을 결정합니다. 

a < b 는 a가 b보다 작을 때 함수값이 true이므로 그 상태일때만 정렬을 실행하게 됩니다.

따라서 결과는 오름차순으로 정렬이 되는 것입니다.

 

그러면 기준이 a > b 라면 어떻게 될까요?

a가 b보다 클 때 정렬을 하게되므로 결과는 내림차순으로 정렬됩니다.

 

#include <iostream>
#include <algorithm>

using namespace std;

class Obj {
public:
	string s;
	int percentage;
	Obj(string s, int percentage) {
		this->s = s;
		this->percentage = percentage;
	}
	// 정렬 기준
	bool operator <(Obj& obj) {
		return this->percentage < obj.percentage;
	}
};

int main() {
	Obj obj[] = {
		Obj("A", 99),
		Obj("B", 82),
		Obj("C", 91),
		Obj("D", 77),
		Obj("E", 85),
	};
	sort(obj, obj + 5);
	for (int i = 0; i < 5; i++)
		cout << obj[i].s << " ";
}
// D B E C A

클래스같은 객체 처럼 묶여진 데이터의 정렬도 sort() 함수를 사용하여 정렬할 수 있습니다. 

클래스 Obj의 내부 멤버 함수로 정렬 기준을 만들어 위와 같이 percentage의 값이 낮은 순서대로 정렬하는 것이 가능합니다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main() {
	vector<pair<int, string>> vtr;
	vtr.push_back(pair<int, string>(99, "A"));
	vtr.push_back(pair<int, string>(82, "B"));
	vtr.push_back(pair<int, string>(91, "C"));
	vtr.push_back(pair<int, string>(77, "D"));
	vtr.push_back(pair<int, string>(85, "E"));

	sort(vtr.begin(), vtr.end());
	for (int i = 0; i < vtr.size(); i++)
		cout << vtr[i].second << " ";
}
// D B E C A

pair 라이브러리를 사용하면 두 데이터타입을 한 쌍으로 묶어 사용할 수 있도록 해줍니다. 정렬을 실행하게 되면 앞의 데이터타입을 기준으로 정렬하게 됩니다. 위 벡터 타입에서 A, B, C, D, E를 기준으로 하는 것이 아니라 99, 82, 91, 77, 85를 기준으로 sort() 를 실행하여 오름차순하게 됩니다. 출력 시에는 오른쪽 데이터타입을 출력하였습니다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool fn(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>>> vtr;
	vtr.push_back(pair<string, pair<int, int>>("A", pair<int, int>(99, 2017280391)));
	vtr.push_back(pair<string, pair<int, int>>("B", pair<int, int>(82, 2019287029)));
	vtr.push_back(pair<string, pair<int, int>>("C", pair<int, int>(99, 2020282423)));
	vtr.push_back(pair<string, pair<int, int>>("D", pair<int, int>(77, 2015289402)));
	vtr.push_back(pair<string, pair<int, int>>("E", pair<int, int>(85, 2021281576)));

	sort(vtr.begin(), vtr.end(), fn);
	for (int i = 0; i < vtr.size(); i++)
		cout << vtr[i].first << " ";
}
// C A E B D

이번에는 pair 라이브러리를 이중으로 사용하여 안쪽 pair의 첫번째 타입 int의 값이 동일한 변수가 있다면 두번째 타입 int의 값을 기준으로 우선적으로 정렬하는 기준을 추가해보겠습니다.

 

기준값을 반환하는 fn() 함수를 만들고 조건을 설정합니다. 매개변수 a와 b에서 second.first는 두번째 타입 pair<int, int>의 첫번째 타입 int를 가리킵니다. 이 타입의 값이 동일하다면 두번째 타입 int를 기준으로 정렬하고 그렇지않으면 첫번째 타입int를 기준으로 정렬합니다. 쉽게 말해, A와 C를 비교할 때 첫번째 타입 int가 99로 동일하므로 두번째 타입 int(학번)를 기준으로 학번이 더 크면 그것을 우선적으로 정렬하는 것입니다.

 

그러므로 출력결과는 C가 A보다 우선적으로 정렬됩니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.