これは特にエレガントなコードではないが、それはデフォルトのハッシュ限り動作するはずとの比較が十分であり、合理的に効率的であるべきである。
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);
}
後RemoveEvenDuplicates
を呼び出すと、ベクトルは次のようになります。
[7]("a","b","d","b","f","h","k")
すべての複製物を消去しますか? (あなたの例が示唆しているように)、またはちょうど**隣接**のもの( 'std :: unique'は何ですか?) –
あなたの例が間違っているか、 'erase'と' std :: unique'を使ったアプローチではこの問題は解決しません。これを明確にしてください。 – moooeeeep
ところで、あなたの例では "k"が最終結果にないのはなぜですか? –