This is not a particularly elegant code, but it should work as long as default hashing and comparison is sufficient, and should be reasonably efficient:
template <typename T>
void RemoveEvenDuplicates(std::vector<T>& v) {
std::unordered_set<T> s;
std::vector<T>::size_type i = 0;
auto last = std::remove_if(
v.begin(),
v.end(),
[&s, &i] (const T& element) -> bool {
if (i++ % 2 == 0) {
auto pair = s.insert(element);
return !pair.second;
}
return false;
}
);
v.erase(last, v.end());
}
void main() {
std::vector<std::string> v;
v.push_back("a");
v.push_back("b");
v.push_back("a");
v.push_back("d");
v.push_back("b");
v.push_back("f");
v.push_back("a");
v.push_back("h");
v.push_back("b");
v.push_back("k");
RemoveEvenDuplicates(v);
}
After the call to RemoveEvenDuplicates
, the vector becomes:
[7]("a","b","d","b","f","h","k")