unique

May 04, 2020

unique

<algorithm> 헤더에 정의되어 있으며 함수 원형은 다음가 같다.

template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return last;

  ForwardIterator result = first;
  while (++first != last)
  {
    if (!(*result == *first))  // or: if (!pred(*result,*first)) for version (2)
      *(++result)=*first;
  }
  return ++result;
}

함수 로직상 중복을 완전히 제거하기 위해서는 sort가 되어 있어야 함을 주의한다.

unique 함수는 순차적으로 탐색하며, 중복이 발생되는 요소를 가장 뒤로 보내고 이렇게 뒤로 옮겨진 요소들 중 가장 첫번째의 iterator를 return 한다.

unique 함수만으로는 값의 삭제는 불가능하며 반환되는 iterator를 활용하여 erase 함수를 호출하는 방식으로 중복을 삭제할 수 있다.

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

using namespace std;

int main(){
    vector<int> arr;

    arr.push_back(1);
    arr.push_back(1);
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

    // 출력 : 1 1 1 2 3
    for(int cur : arr) cout << cur << " ";
    cout << endl;

    // 출력 : 1 2 3 2 3
    // 뒤로 옮겨진 값들의 무결성은 보장할 수 없음
    unique(arr.begin(), arr.end());
    for(int cur : arr) cout << cur << " ";
    cout << endl;

    // 출력 : 1 2 3
    sort(arr.begin(), arr.end());
    arr.erase(unique(arr.begin(), arr.end()), arr.end());
    for(int cur : arr) cout << cur << " ";
    cout << endl;
}

songmk 🙁