1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
//----------------------------------------------------------------------------
// Remove unique elements to the end of the sorted range. Returns an iterator
// to the new end of the range.
template <typename ForwardIterator>
ForwardIterator
anti_unique( ForwardIterator begin, ForwardIterator end )
{
ForwardIterator result = begin;
ForwardIterator first_equal = begin;
size_t count_equal = 1;
while (++begin != end)
{
if (*begin == *first_equal) ++count_equal;
else
{
if (count_equal > 1)
{
result = std::copy( first_equal, begin, result );
}
first_equal = begin;
count_equal = 1;
}
}
if (count_equal > 1)
{
result = std::copy( first_equal, begin, result );
}
return result;
}
//----------------------------------------------------------------------------
int main()
{
using namespace std;
int _xs[] = { 6, 1, 3, 4, 1, 7, 5, 3, 7 };
vector <int> xs( _xs, _xs + (sizeof( _xs ) / sizeof( int )) );
vector <int> ys( xs ); // copy
sort( ys.begin(), ys.end() ); // sort
ys.erase( anti_unique( ys.begin(), ys.end() ), ys.end() );
cout << "non-unique elements: ";
copy( ys.begin(), ys.end(), ostream_iterator <int> ( cout, " " ) );
cout << endl;
return 0;
}
|