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 | Description |
---|---|
first | 범위에 첫번째 forward iterator 범위에 포함된다. |
end | 범위의 마지막 forward iterator 범위에 포함되지 않는다. |
pred | 범위의 두 요소를 인수로 받아들이고 bool 값을 반환하는 이진 함수반환된 값은 두 인수가 동일 여부를 나타낸다( true 인 경우 두 인수가 동일하고 그 중 하나가 제거됨)함수는 인수를 수정하지 않으며, 함수 포인터 또는 함수 개체일 수 있다. |
제거되지 않은 마지막 요소 뒤에 오는 요소에 대한 iterator를 반환한다.
#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;
}
myvector contains: 10 20 30 20 10