Programing/C++

[C++] Unique 함수에 대하여 (배열 내 중복 요소 제거하는 방법)

hye3193 2025. 2. 21. 20:24

주의할 점.

중복 요소를 제거할 배열이 정렬된 상태여야 한다

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

코드부터 보자면 위와 같이 작성해 주면 중복된 요소가 제거된 상태가 된다

 

erase 함수는 첫번째 인자로 들어간 위치부터 두번째 인자로 들어간 인자까지의 요소를 제거한다

unique 함수는 중복되는 요소를 없애는 함수이다

 

unique 함수의 코드를 알아보자

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;
}

출처: https://cplusplus.com/reference/algorithm/unique/

 

unique 함수는 시작 지점과 끝 지점의 iterator를 받는다

임의의 배열을 인자로 넘겼을 때의 상태이다

이 상태에서 last 위치에 도달할 때까지 first에 1씩 더해주며 while문 안을 돌아준다

 

while문에 진입하며 ++first되었기 때문에 first는 두 번째 인덱스를 가르키고,

*result와 *first가 같지 않기 때문에 ++result의 값은 first가 가르키던 값이 된다

 

하지만 ++result 하게 되면 first의 위치와 같기 때문에 실질적으로 배열은 그대로이다

 

이후 다시 ++first가 되고, 이 때 *result와 *first가 같기 때문에 이번에는 if문 실행 없이 넘어가게 된다

 

다시 ++first를 해 주면, *result와 *first 값이 달라지게 되어 if문 내부를 실행한다

++result의 위치에 *first를 넣어 주면 위와 같이 된다

 

이후로도 쭉 while문을 따라가 보자

쭉 result와 first가 가르키는 값이 같았다가, 7번째 인덱스에서 값이 달라진다

위와 같이 배열이 변한다

 

다음, first가 한 칸 이동하고, 값이 다르기 때문에 또 result도 한칸 이동하여 값이 바뀐다

 

끝까지 이동하면 배열은 위와 같은 상태가 된다

따라서 result가 가르키는 위치 뒤로는 의미없는 값이 남은 상태가 된다

 

마지막으로 ++result 값을 반환하기 때문에, 이를 이용하여 가장 처음 나왔던 코드처럼 뒤쪽에 있는 쓸데없는 값을 지워줄 수 있게 된다