[C++] 인접한 중복 요소 제거 std::unique()

bolee·2022년 12월 3일
0

C++

목록 보기
9/16
post-thumbnail

std::unique()

#include <algorithm>

template <class ForwardIterator>  ForwardIterator unique (ForwardIterator first, ForwardIterator last); // equality (1)

template <class ForwardIterator, class BinaryPredicate>  ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred); //predicate (2)

범위에 있는 동등한 요소의 모든 연속 그룹의 범위([first,last))에서 인접한 중복 요소를 제거한다.

std::unique()는 배열 또는 컨테이너의 크기를 변경하지 않으며, 중복 요소를 중복되지 않은 다음 요소로 교체하여 제거한다.
제거되지 않은 마지막 요소 뒤에 오는 요소에 대한 iterator를 반환하여 단축된 범위의 새 크기를 알려준다.

제거되지 않은 요소의 상대적인 순서는 유지되는 반면 반환된 반복자와 last 사이의 요소는 유효하지만 지정되지 않은 상태로 남아 있다.

Parameters

ParametersDescription
first범위에 첫번째 forward iterator
범위에 포함된다.
end범위의 마지막 forward iterator
범위에 포함되지 않는다.
pred범위의 두 요소를 인수로 받아들이고 bool 값을 반환하는 이진 함수
반환된 값은 두 인수가 동일 여부를 나타낸다(true인 경우 두 인수가 동일하고 그 중 하나가 제거됨)
함수는 인수를 수정하지 않으며, 함수 포인터 또는 함수 개체일 수 있다.

Return value

제거되지 않은 마지막 요소 뒤에 오는 요소에 대한 iterator를 반환한다.


Example

#include <iostream>     // std::cout
#include <algorithm>    // std::unique, std::distance
#include <vector>       // std::vector

bool myfunction (int i, int j) {
  return (i==j);
}

int main () {
  int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
  std::vector<int> myvector (myints,myints+9);

  // using default comparison:
  std::vector<int>::iterator it;
  it = std::unique(myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
                                                         //                ^

  myvector.resize(std::distance(myvector.begin(), it)); // 10 20 30 20 10

  // using predicate comparison:
  std::unique(myvector.begin(), myvector.end(), myfunction);   // (no changes)

  // print out content:
  std::cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

Output

myvector contains: 10 20 30 20 10

참고 자료

0개의 댓글