C, C++ & Linux/C++

[C++] 벡터 정렬, 중복제거 (sort, unique, erase)

서노리 2022. 9. 4. 23:00
반응형

문제를 풀 때 마다 검색하는 것 같아서 한 번 정리한다.

 

벡터 정렬하기

오름차순 정렬

#include <bits/stdc++.h>
using namespace std;

vector<int> v;
int main(){
    v.push_back(3);
    v.push_back(1);
    v.push_back(6);
    v.push_back(1);
    v.push_back(2);
    v.push_back(5);
    v.push_back(4);
    v.push_back(2);

    sort(v.begin(), v.end());
    for(int i : v) cout << i << ' ';
}

만약 벡터가 아닌 크기 10의 배열인 arr을 정렬하고 싶다면 v.begin() 대신 arr, v.end() 대신 arr + 10 을 넣어주면 된다.

 

정렬 기준 바꾸기

bool compare(자료형 a, 자료형 b){
    return 원하는 조건문;
}

bool형을 리턴하는 사용자 정의 함수를 만들어서 sort 함수의 인자로 넣어주면 정렬 기준을 변경할 수 있다.

 

- ex) 내림차순 정렬

bool compare(int &x, int &y){
    return x > y;
}

 

 

- ex) 문자열 길이 순 정렬, 길이 같을 때는 사전식 정렬

bool compare(string &x, string &y){
    if(x.length() == y.length()){
        return x < y;
    }
    else{
        return x.length() < y.length();
    }
}

벡터 중복 제거

sort, unique, erase 함수를 활용하여 중복 제거를 할 수 있다.

unique 함수는 연속된 중복 원소를 벡터의 가장 뒷부분으로 보내버리는 함수이다. 

따라서 unique함수를 실행하기 전에 sort를 통해 정렬되어 있어야하고 unique 실행 후에는 erase를 통해

뒷 부분을 삭제해주어야한다.

sort(v.begin(), v.end(), compare);
v.erase(unique(v.begin(), v.end()), v.end());

unique 함수의 실행이 끝나고 리턴하는 값은 벡터의 첫 번째 쓰레기 값의 주소이다.

따라서 위와 같이 erase 함수의 시작 인자로 unique 함수 자체를 넣어줄 수 있다.


 

반응형

'C, C++ & Linux > C++' 카테고리의 다른 글

[C++] STL - next_permutation  (0) 2022.08.01
[C++] STL - pair, tuple  (1) 2022.07.01
[C++] STL - list  (0) 2022.06.29
[C++] STL - deque  (0) 2022.06.29
[C++] STL - vector  (0) 2022.06.29