如何在列表中删除重复项并只保留唯一指针

How to remove duplicates and keep only unique pointers in list?

本文关键字:保留 指针 唯一 列表 删除      更新时间:2023-10-16

可能重复:
如何使向量的元素唯一?(删除不相邻的重复项)
从列表中删除重复项<int>

我有像这样的指针列表

std::list<Person*> persons;

并且在填充期间该列表中存在重复项。如何删除重复项并在列表中只保留唯一指针?

如果可以更改元素的顺序,则首先使用list::sort对列表进行排序,然后使用list::unique删除重复项。

std::less<Person*> cmp;
persons.sort(cmp);
persons.unique(cmp);

另一方面,您可以使用std::set。它的元素是唯一的、有序的,如果集合中已经存在元素,则insert方法将失败。

请记住,插入单个元素的时间复杂性是对数的,而将元素添加到列表的前面或后面是恒定的时间。另一方面,std::list::sortN*log(N),而std::unique是线性的。因此,如果您打算经常执行这些重复删除,最好首先使用std::set。还要注意,在C++11中有std::unordered_set,它具有元素唯一性和插入和删除的平均常数复杂性。

如果您不关心插入顺序,请使用set而不是list。它只能有唯一的元素,它会自动进行其他人推荐的排序。

如果你真的关心插入顺序,可以这样做:

auto i = std::find(persons.begin(), persons.end(), pPerson);
if(i != persons.end())
    persons.erase(i);
persons.insert(pPerson);

(我没有编译)

根据列表所指向的地址对列表进行排序。使用简单循环删除重复项。