언어/C++

C++ Vector(벡터) - find, erase, unique, sort, upper_bound, lower_bound 사용법

시간빌게이츠 2022. 4. 2. 22:44

sort

    #include <vector>
    #include <algorithm>

    vector<int> v;
    v.push_back(4);
    v.push_back(3);
    v.push_back(2);
    v.push_back(1);

    sort(v.begin(),v.end()); // 내림 차순 정렬
    sort(v.begin(),v.end(),greater<int>()); // 오름차순 정렬

혹은 직접 함수를 만들어 정렬 조건을 다르게 만들 수 있음

bool cmp(int a, int b){
    return a>b;
}
sort(v.begin(),v.end(), cmp); // 오름차순 정렬

이게 a가 b보다 크면 true를 반환 아니면 false를 반환. 값이 true면 a를 선택 

find

    #include <vector>
    #include <algorithm>
    vector<int> a;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);

    cout << find(a.begin(),a.end(),3) - a.begin(); // 시작점을 꼭 빼기!
  • 결과 : 찾은 값의 인덱스를 반환 -> 2 반환
    find(start,end) 범위 [start,end) end를 포함하지 않음
    find는 범위 안에서 값을 찾아서 iterator를 리턴하기 때문에 시작점을 빼주어야 찾고자 하는 인덱스가 리턴됨

erase

    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);

    a.erase(a.begin(), a.end());
  • 결과 : 1234 다 지워짐
    erase(start, end) 여기서 범위는 [start, end) end를 포함하지 않음 (주의)
    만약 3만 지우고 싶다면 erase(a.begin()+2, a.begin()+3)
    여기서 3을 지운후 capacity는 그대로이고 뒤에 원소들을 앞으로 옮겨 size만 줄어듬.

응용해서 자신이 원하는 값을 찾아 지우고 싶은 경우는

    int idx = find(a.begin(),a.end()) - a.begin();
    a.erase(a.begin()+idx,a.begin()+dix+1);
  • 이런식으로 find와 결합하여 원하는 원소를 찾아 제거 가능

unique

    sort(a.begin(), a.end()); // 정렬을 해주어야 함
    unique(a.begin(),a.end()); // 중복값을 맨뒤로 보내고 그 중복값이 시작하는 iterator 반환

    //중복값을 제거 하기위해서는 earse와 결합
    a.erase(unique(a.begin(),a.end()), a.end()); 
    // 중복값을 맨뒤로 보내고 그 중복값 시작부터 끝까지 지워주면됨
  • 모든 중복된 값을 정리하기 위해서는 sort를 하고 unique를 이용하자!

 

lower_bound, upper_bound

    lower_bound(a.begin(),a.end(), 3) - a.begin();
    upper_bound(a.begin(),a.end(), 3) - a.begin();
  • lower은 배열에서 자신이 찾고 싶은 값 이상이 처음으로 나오는 원소의 주소를 반환
    리턴값은 iterator이기 때문에 -a.begin()을 해주어야 인덱스 값을 얻을 수 있다.
    모두 작다면 a.end() 리턴
    ex) a가 1224 입력값 3이라면 3이 나온다.
  • upper는 배열에서 자신이 찾고 싶은 값을 처음으로 초과하는 원소의 주소를 반환
    마찬가지로 리턴값은 iterator이기 때문에 -a.begin()을 해주어야 인덱스 값을 얻을 수 있다.
    모두 작거나 같으면 a.end() 리턴
    ex) a가 12234 입력값 3이라면 4가 나온다.
  • lower, upper_bound는 이분탐색을 이용하기 때문에 정렬된 배열에서 사용해야 한다. (주의)