#include <list>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
template<typename Iterator>
void print(Iterator begin, Iterator end)
{
cout << "( " ;
for (auto it = begin; it != end; ++it)
cout << *it << " ";
cout << ")" << endl;
}
template<typename T>
void print(const T & values)
{
print(values.begin(), values.end());
}
bool not_equal(int a, int b)
{
return a != b;
}
int main( )
{
using namespace std;
list<int> values;
values.push_back( 50 );
values.push_back( 40 );
values.push_back( 40 );
values.push_back( 40 );
values.push_back( 10 );
values.push_back( 20 );
values.push_back( 20 );
values.push_back( 20 );
print(values);
list<int> out;
auto it = adjacent_find(values.begin(), values.end());
while (it != values.end())
{
out.push_back(*it);
++it;
it = adjacent_find(it, values.end());
}
print(out);
{
auto v = values;
cout << "unique" << endl;
print(v);
auto e = unique(v.begin(), v.end());
print(v.begin(), e);
}
{
auto v = values;
cout << "not unique" << endl;
print(v);
auto e = unique(v.begin(), v.end(), not_equal);
print(v.begin(), e);
}
{
auto v = values;
cout << endl << "custom" << endl;
print(v);
v.sort();
cout << "sorted" << endl;
print(v);
set<int> out;
auto prev = v.begin();
auto current = ++v.begin();
for (; current != v.end(); ++current)
{
if (*prev == *current)
out.insert(*prev);
++prev;
}
print(out);
}
return 0;
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvcj4Kdm9pZCBwcmludChJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQp7CiAgIGNvdXQgPDwgIiggIiA7CiAgIGZvciAoYXV0byBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpCiAgICAgIGNvdXQgPDwgKml0IDw8ICIgIjsKICAgY291dCA8PCAiKSIgPDwgZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBwcmludChjb25zdCBUICYgdmFsdWVzKQp7CglwcmludCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKfQoKYm9vbCBub3RfZXF1YWwoaW50IGEsIGludCBiKQp7CglyZXR1cm4gYSAhPSBiOwp9CgppbnQgbWFpbiggKSAKewogICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICBsaXN0PGludD4gdmFsdWVzOwogICAKICAgdmFsdWVzLnB1c2hfYmFjayggNTAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggNDAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggNDAgKTsgICAKICAgdmFsdWVzLnB1c2hfYmFjayggNDAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggMTAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggMjAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggMjAgKTsKICAgdmFsdWVzLnB1c2hfYmFjayggMjAgKTsKCglwcmludCh2YWx1ZXMpOwoJCglsaXN0PGludD4gb3V0OwoJYXV0byBpdCA9IGFkamFjZW50X2ZpbmQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Cgl3aGlsZSAoaXQgIT0gdmFsdWVzLmVuZCgpKQoJewoJCW91dC5wdXNoX2JhY2soKml0KTsKCQkrK2l0OwoJCWl0ID0gYWRqYWNlbnRfZmluZChpdCwgdmFsdWVzLmVuZCgpKTsKCX0KCQoJcHJpbnQob3V0KTsKCQoJewoJCWF1dG8gdiA9IHZhbHVlczsKCQljb3V0IDw8ICJ1bmlxdWUiIDw8IGVuZGw7CgkJcHJpbnQodik7CgkJYXV0byBlID0gdW5pcXVlKHYuYmVnaW4oKSwgdi5lbmQoKSk7CgkJcHJpbnQodi5iZWdpbigpLCBlKTsKCX0KCQoJewoJCWF1dG8gdiA9IHZhbHVlczsKCQljb3V0IDw8ICJub3QgdW5pcXVlIiA8PCBlbmRsOwoJCXByaW50KHYpOwoJCWF1dG8gZSA9IHVuaXF1ZSh2LmJlZ2luKCksIHYuZW5kKCksIG5vdF9lcXVhbCk7CgkJcHJpbnQodi5iZWdpbigpLCBlKTsKCX0KCQoJewoJCWF1dG8gdiA9IHZhbHVlczsKCQljb3V0IDw8IGVuZGwgPDwgImN1c3RvbSIgPDwgZW5kbDsKCQlwcmludCh2KTsKCQl2LnNvcnQoKTsKCQljb3V0IDw8ICJzb3J0ZWQiIDw8IGVuZGw7CgkJcHJpbnQodik7CgkJCgkJc2V0PGludD4gb3V0OwoJCQoJCWF1dG8gcHJldiA9IHYuYmVnaW4oKTsKCQlhdXRvIGN1cnJlbnQgPSArK3YuYmVnaW4oKTsKCQlmb3IgKDsgY3VycmVudCAhPSB2LmVuZCgpOyArK2N1cnJlbnQpCgkJewoJCQlpZiAoKnByZXYgPT0gKmN1cnJlbnQpCgkJCQlvdXQuaW5zZXJ0KCpwcmV2KTsKCQkJKytwcmV2OwoJCX0KCQkKCQlwcmludChvdXQpOwoJfQoKICAgcmV0dXJuIDA7Cn0K