안녕하세요 ~ 깨륵입니다 '▽'/ 벡터 두번째 시간이에요!
이 포스팅은 평소 제가 알고리즘 문제를 풀며 필요로 했던,
벡터 원소를 원하는 대로 간단히 처리하는 코드 중 원하는 순서로 정렬하는 기능을 가져와봤어요~.~
만약 벡터 기본 사용법이 익숙치 않다는 분들은 아래 게시물👇🏻 부터 보고 와주세요!
[C++ STL : vector] vector 기본 사용법 - 생성, 참조, 원소 추가 및 삭제
algorithm 헤더 불러오기
#include <algorithm>
먼저 알고리즘 헤더를 불러오세요.
벡터 소팅 (vector sorting)
: 벡터 원소를 원하는 대로 정렬할 때 쓰입니다.
1. 오름차순 정렬
sort(vec.begin(), vec.end());
: sort함수의 기본 형태 중 iterator를 이용하여 호출하는 방식입니다.
배열의 경우 sort(배열이름, 배열이름+배열크기) 형태로 불러온답니다!
2. 내림차순 정렬
sort(vec.begin(), vec.end(), greater<int>());
: 표준라이브러리 내에 있는 greater() 라는 비교 함수를 마지막 파라미터로 전달하여,
숫자가 클수록 앞으로 정렬되게 설정해줍니다.
사용 예시
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec;
int arr[] = {3, 2, 1, 1, 7};
vec.assign(arr, arr+5);
//greater함수 호출 시, vector의 자료형과 동일하도록 신경써주세요
sort(vec.begin(), vec.end(), greater<int>());
for(int i=0; i<5; i++)
{
cout<<vec[i]<<' ';
}
return 0;
}
출력 결과
7 3 2 1 1
주의!
만약, grater함수와 vector의 자료형을 맞추지 않았을 시, 잘못 정렬될 수 있습니다.
-float형 벡터
에 int형 greater함수
를 사용했을 경우
오류 예시
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<float> vec;
float arr[] = {3.2, 2.9, 1.1, 1.4, 7};
vec.assign(arr, arr+5);
//일부러 int형으로 호출해보았습니다
sort(vec.begin(), vec.end(), greater<int>());
for(int i=0; i<5; i++)
{
cout<<vec[i]<<' ';
}
return 0;
}
출력 결과
7 3.2 2.9 1.1 1.4 //1.1 < 1.4 인데 정수형이라서 앞에 1만 판별
보시는 바와 같이 '7 3.2 2.9 1.4 1.1'순으로 정렬되는 게 아닌, 마지막 두 숫자의 순서가 바뀐채로 정렬이 되었습니다 😨
그러니 꼭 같은 자료형으로 호출하는거! 잊지마세요 ㅎㅎ
3. 사용자 지정 함수대로 정렬 (custom sorting)
bool compare(자료형 a, 자료형 b)
{
return 원하는_조건문;
}
sort(vec.begin(), vec.end(), compare); //compare : 원하는 대로 처리할 사용자 지정 함수
: 2의 greater함수처럼 뒤에 자신이 만든 함수를 마지막 파라미터 값으로 넣어주면 됩니다!
compare함수 예시
bool compare(string a, string b)
{
return a.size() < b.size();
}
: 위의 함수는 vector<string>형 벡터를 기준으로 만들었는데, string의 길이가 짧을수록 앞으로 정렬되는 기능입니다.
전체 코드 예시
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool compare(string a, string b)
{
return a.size() < b.size();
}
int main()
{
vector<string> vec;
string arr[] = {"watermelon", "peach", "apple", "banana", "blueberry"};
vec.assign(arr, arr+5);
sort(vec.begin(), vec.end()); //가,나,다 순
cout<<endl<<"일반 소팅 후"<<endl;
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<", ";
}
sort(vec.begin(), vec.end(), compare); //길이 순
cout<<endl<<endl<<"사용자지정 소팅 후"<<endl;
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<", ";
}
return 0;
}
출력 결과
일반 소팅 후
apple, banana, blueberry, peach, watermelon,
사용자지정 소팅 후
apple, peach, banana, blueberry, watermelon,
일반 정렬의 경우 string이기 때문에 abc순으로 정렬되었는데, 사용자지정 정렬의 경우 글자수대로 오름차순 정렬 되었습니다!
이처럼 원하는 방법대로 bool값을 리턴하는 compare함수(함수명은 상관 X)를 만들어 호출해주면
원하는 그 어떤 방식으로든 정렬할 수 있습니다 'O'
앞으로도 vector의 사용법에 대해 새롭게 알게되는 사실이 있다면
새 포스팅으로 공유해보도록 하겠습니다ㅎㅎ
도움이 되셨다면 공감❤️ 부탁드려요!
이상 깨륵이었습니다 👽
가감없는 피드백 언제나 환영합니다 '▽' /
도움이 되셨다면 댓글과 공감 부탁드려요! ❤️💜
'Programming > C++' 카테고리의 다른 글
[C++ STL : vector] 벡터 중복원소 제거 (0) | 2020.11.22 |
---|---|
[C++ STL : vector] vector 기본 사용법 - 생성, 참조, 원소 추가 및 삭제 (0) | 2020.11.12 |