Если вы можете изменить порядок элементов, сначала отсортируйте список с помощью list::sort, а затем удалите дубликаты с помощью list::unique.
std::less<Person*> cmp;
persons.sort(cmp);
persons.unique(cmp);
С другой стороны, вы могли бы использовать std::set. Элементы уникальны, упорядочены, а метод insert терпит неудачу, если элемент уже присутствует в наборе.
Помните, что временная сложность вставки отдельных элементов логарифмическая, тогда как добавление элементов в переднюю или заднюю часть списка является постоянным временем. С другой стороны, std::list::sort
- N*log(N)
, а std::unique
- линейный. Поэтому, если вы намерены часто выполнять эти повторяющиеся удаления, вам лучше всего использовать std::set
. Также обратите внимание, что в C++ 11 есть std::unordered_set, который имеет уникальность элемента и среднюю постоянную сложность для вставки и удаления.
Может быть, вы выбрали неправильную структуру данных? Рассмотрим переход на 'std :: set'. – Vlad
Вы хотите сохранить относительный порядок элементов? – juanchopanza