我有类似的指针列表
std::list<Person*> persons;
并且在填充过程中此列表中有重复项。如何删除重复项并仅保留列表中的唯一指针?
我有类似的指针列表
std::list<Person*> persons;
并且在填充过程中此列表中有重复项。如何删除重复项并仅保留列表中的唯一指针?
如果您可以更改元素的顺序,则首先使用list::sort对列表进行排序,然后使用list::unique删除重复项。
std::less<Person*> cmp;
persons.sort(cmp);
persons.unique(cmp);
另一方面,您可以使用std::set。它的元素是唯一的、有序的,如果集合中已经存在一个元素,则插入方法会失败。
请记住,插入单个元素的时间复杂度是对数的,而将元素添加到列表的前面或后面是恒定时间。另一方面,std::list::sort
是N*log(N)
,并且std::unique
是线性的。因此,如果您打算频繁执行这些重复删除,则最好std::set
首先使用 an 。另请注意,在 C++11 中有std::unordered_set,它具有元素唯一性和插入和删除的平均常数复杂度。
如果您不关心插入顺序,请使用 aset
而不是 a list
。它只能有独特的元素,它会自动进行其他人推荐的排序。
如果您确实关心插入顺序,请执行以下操作:
auto i = std::find(persons.begin(), persons.end(), pPerson);
if(i != persons.end())
persons.erase(i);
persons.insert(pPerson);
(我没有编译那个)
根据他们指向的地址对列表进行排序。用一个简单的循环删除重复项。