Он сказал, что хочет использовать идиому удаления-удаления, поэтому вот возможный способ, используя функциональный объект:
struct Unifier{
set<int> foundElements;
bool operator()(int & a){
if(foundElements.find(a) != foundElements.end()){
return true;
}else{
foundElements.insert(a);
return false;
}
}
};
int main(){
list<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(5);
v.push_back(3);
v.push_back(5);
v.push_back(3);
copy (v.begin(), v.end(), ostream_iterator<int>(cout," "));
Unifier u;
v.remove_if(u);
cout << endl << "After:" << endl;
copy (v.begin(), v.end(), ostream_iterator<int>(cout," "));
}
Обновление : приведенный выше код имееттонкая ошибка.Согласно C ++ 11 [algorithms.general]/10
:
[Примечание: если не указано иное, алгоритмы, которые принимают функциональные объекты в качестве аргументов, могут свободно копировать эти функциональные объекты.Программистам, для которых важна идентификация объекта, следует рассмотреть возможность использования класса-обертки, который указывает на некопированный объект реализации, такой как reference_wrapper<T>
(20.8.3), или какое-либо эквивалентное решение.—Конец примечания]
Похоже, что для «1015 *« не указано иное », поэтому этот код может не удалить все дубликаты, поскольку он может создать копии предиката в начале, а затемиспользуйте разные копии предиката для разных частей списка. Пример этого на самом деле происходит для std :: remove_if .
Простое исправление для C ++ 11 - заменить v.remove_if(u)
на:
v.remove_if( reference_wrapper<decltype(u)>(u) );
В C++ 03 Я не уверен, присутствовала ли приведенная выше цитата;но если бы это было тогда, исправление должно было бы сделать foundElements
статичным или изменить рефакторинг Unifier
так, чтобы все его копии ссылались на один экземпляр foundElements
.
Ссылка на связанныйвопрос