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

C++ 如何删除重复项并在列表中只保留唯一指针?,c++,stl,C++,Stl,可能重复: 我有一个指针列表,比如 std::list<Person*> persons; 填写时,此列表中有重复项。如何删除重复项并在列表中只保留唯一指针?根据指针指向的地址对列表进行排序。使用简单循环删除重复项。根据列表指向的地址对列表进行排序。使用简单循环删除重复项。如果可以更改元素的顺序,则首先使用对列表进行排序,然后使用删除重复项 另一方面,你可以使用一个。它的元素是唯一的、有序的,如果集合中已经存在元素,则该方法将失败 请记住,插入单个元素的时间复杂度是对数的,而将元

可能重复:

我有一个指针列表,比如

std::list<Person*> persons;

填写时,此列表中有重复项。如何删除重复项并在列表中只保留唯一指针?

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

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

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

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


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

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

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


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

如果您不关心插入顺序,请使用集合而不是列表。其中只能有唯一的元素,它将自动完成其他人推荐的排序

如果您确实关心插入顺序,请执行以下操作:

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

persons.insert(pPerson);

我没有编译这个

如果您不关心插入顺序,请使用集合而不是列表。其中只能有唯一的元素,它将自动完成其他人推荐的排序

如果您确实关心插入顺序,请执行以下操作:

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

persons.insert(pPerson);

我没有编译这个

也许你选择了错误的数据结构?考虑切换到STD::St.是否保留元素的相对顺序?也许您选择了错误的数据结构?考虑切换到STD::SET。是否要保留元素的相对顺序?羞愧排序不返回列表……插入一次,不管你做一个ON log n排序,都不会有太大的区别。如果你想在每次插入之后调用排序和唯一的话,一个SET插入会更快。“可能快多了!”Dave在每次插入后调用sort和unique会非常疯狂。但我会补充几句关于这些方法的时间复杂度。指针列表的排序是如何工作的?您不能使用<或>来比较任意指针:shame排序不会返回列表&…不管怎样,一旦您执行ON log N排序,插入时间不会有太大影响。如果您要在每次插入后调用sort和unique,则set insert会更快。“可能快多了!”Dave在每次插入后调用sort和unique会非常疯狂。但我会补充几句关于这些方法的时间复杂度。指针列表的排序是如何工作的?不能使用<或>来比较任意指针: