#include <algorithm>
#include <vector>
#include <iterator>
#include <set>
#include <iostream>
#include <numeric>
using namespace std;
struct setPredicate
{
std::set<int>* p_set;
setPredicate(std::set<int>* pSet) : p_set(pSet) {}
bool operator()(int n)
{ return p_set->insert(n).second; }
};
int main()
{
int testData [] = { 1, 2, 4, 3, 2, 4 };
std::vector<int> L(testData, testData + 6);
std::set<int> tempSet;
//...
// partition the elements, unique items on left, duplicates on right
std::vector<int>::iterator divider =
stable_partition(L.begin(), L.end(), setPredicate(&tempSet));
// do something with the duplicates, for example, print them
cout << "Here are the dups:\n";
copy(divider, L.end(), ostream_iterator<int>(cout, " "));
// get the average
// get number of duplicates
size_t numDups = std::distance(divider, L.end());
double avg = 0.0;
// compute average using std::accumulate
if ( numDups > 0 )
avg = std::accumulate(divider, L.end(), 0.0) / numDups;
cout << "\nThe average of the duplicates is: " << avg << "\n";
// erase the duplicates
L.erase(divider, L.end());
// print the updated vector now
cout << "\n\nHere is the resulting vector:\n";
copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
}
ICAgICNpbmNsdWRlIDxhbGdvcml0aG0+CiAgICAjaW5jbHVkZSA8dmVjdG9yPgogICAgI2luY2x1ZGUgPGl0ZXJhdG9yPgogICAgI2luY2x1ZGUgPHNldD4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxudW1lcmljPgogICAgCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgCiAgICBzdHJ1Y3Qgc2V0UHJlZGljYXRlCiAgICB7CiAgICAJc3RkOjpzZXQ8aW50PiogcF9zZXQ7CiAgICAJc2V0UHJlZGljYXRlKHN0ZDo6c2V0PGludD4qIHBTZXQpIDogcF9zZXQocFNldCkge30KICAgIAlib29sIG9wZXJhdG9yKCkoaW50IG4pIAogICAgCXsgIHJldHVybiBwX3NldC0+aW5zZXJ0KG4pLnNlY29uZDsgfQogICAgfTsKICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgCWludCB0ZXN0RGF0YSBbXSAgPSB7IDEsIDIsIDQsIDMsIDIsIDQgfTsKICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IEwodGVzdERhdGEsIHRlc3REYXRhICsgNik7CiAgICAgICAgc3RkOjpzZXQ8aW50PiB0ZW1wU2V0OwogICAgICAgIC8vLi4uCiAgICAgICAgLy8gcGFydGl0aW9uIHRoZSBlbGVtZW50cywgdW5pcXVlIGl0ZW1zIG9uIGxlZnQsIGR1cGxpY2F0ZXMgb24gcmlnaHQKICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBkaXZpZGVyID0gCiAgICAgICAgICAgIHN0YWJsZV9wYXJ0aXRpb24oTC5iZWdpbigpLCBMLmVuZCgpLCBzZXRQcmVkaWNhdGUoJnRlbXBTZXQpKTsKICAgIAogICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBkdXBsaWNhdGVzLCBmb3IgZXhhbXBsZSwgcHJpbnQgdGhlbQogICAgICAgIGNvdXQgPDwgIkhlcmUgYXJlIHRoZSBkdXBzOlxuIjsKICAgICAgICBjb3B5KGRpdmlkZXIsIEwuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8aW50Pihjb3V0LCAiICIpKTsKCiAgICAgICAgLy8gZ2V0IHRoZSBhdmVyYWdlCgogICAgICAgIC8vIGdldCBudW1iZXIgb2YgZHVwbGljYXRlcyAgCiAgICAgICAgc2l6ZV90IG51bUR1cHMgPSBzdGQ6OmRpc3RhbmNlKGRpdmlkZXIsIEwuZW5kKCkpOyAgCiAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKCiAgICAgICAgLy8gY29tcHV0ZSBhdmVyYWdlIHVzaW5nIHN0ZDo6YWNjdW11bGF0ZQogICAgICAgIGlmICggbnVtRHVwcyA+IDAgKSAKICAgICAgICAgICBhdmcgPSBzdGQ6OmFjY3VtdWxhdGUoZGl2aWRlciwgTC5lbmQoKSwgMC4wKSAvIG51bUR1cHM7CiAgICAgICAgY291dCA8PCAiXG5UaGUgYXZlcmFnZSBvZiB0aGUgZHVwbGljYXRlcyBpczogIiA8PCBhdmcgPDwgIlxuIjsKICAgIAogICAgICAgIC8vIGVyYXNlIHRoZSBkdXBsaWNhdGVzCiAgICAgICAgTC5lcmFzZShkaXZpZGVyLCBMLmVuZCgpKTsKICAgIAogICAgICAgIC8vIHByaW50IHRoZSB1cGRhdGVkIHZlY3RvciBub3cKICAgICAgICBjb3V0IDw8ICJcblxuSGVyZSBpcyB0aGUgcmVzdWx0aW5nIHZlY3RvcjpcbiI7CiAgICAgICAgY29weShMLmJlZ2luKCksIEwuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8aW50Pihjb3V0LCAiICIpKTsKICAgIH0K