본문 바로가기

Programming/C++

[C++ STL : vector] 벡터 정렬(vector sorting) - 오름차순, 내림차순, 사용자 지정 정렬

 

 

안녕하세요 ~ 깨륵입니다 '▽'/ 벡터 두번째 시간이에요!

이 포스팅은 평소 제가 알고리즘 문제를 풀며 필요로 했던,

벡터 원소를 원하는 대로 간단히 처리하는 코드 중 원하는 순서로 정렬하는 기능을 가져와봤어요~.~

 

 

 

만약 벡터 기본 사용법이 익숙치 않다는 분들은 아래 게시물👇🏻 부터 보고 와주세요!

 

[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의 사용법에 대해 새롭게 알게되는 사실이 있다면

새 포스팅으로 공유해보도록 하겠습니다ㅎㅎ

도움이 되셨다면 공감❤️ 부탁드려요!

 

이상 깨륵이었습니다 👽

 


가감없는 피드백 언제나 환영합니다  '▽' /
도움이 되셨다면 댓글과 공감 부탁드려요! ❤️💜