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

时间:2012-08-20 13:21:16

标签: c++ stl

  

可能重复:
  How to make elements of vector unique? (remove non adjacent duplicates)
  Remove duplicates from a list<int>

我有像

这样的指针列表
std::list<Person*> persons;

填写期间此列表中有重复项。如何删除重复项并仅保留列表中的唯一指针?

3 个答案:

答案 0 :(得分:8)

如果您可以更改元素的顺序,请先使用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,它具有元素唯一性和插入和删除的平均常量复杂度。

答案 1 :(得分:2)

如果您不关心广告订单,请使用set代替list。其中只能包含唯一的元素,并且会自动进行其他人的推荐。

如果您关心插入订单,请执行以下操作:

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

persons.insert(pPerson);

(我没有编译)

答案 2 :(得分:1)

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