C ++在列表中找到双打

时间:2013-05-22 16:12:04

标签: c++ list compare

我必须找到我的list<SnakeParts>中是否有双打,并且如果有双打则将其设置为false

我尝试使用unique()的{​​{1}}功能,并为我的班级添加了list。 现在,当我执行唯一功能时,我不会过滤掉双打。经过一些调试后,我发现operator==()比较器只被执行了多次,因为我的列表中有对象,我使用了以下代码:

==

运算符:

list<SnakePart> uniquelist = m_snakeParts;
uniquelist.unique();
if (m_snakeParts.size() != uniquelist.size()){
    alive = false;
}

但这不起作用。那么我做错了什么,还是有另外一种方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

std::list::unique仅适用于连续重复项。比方说,如果我们有{1, 2, 2, 1},则在致电unique后我们得到{1, 2, 1}。您可以在sort复杂度之前使用N * log(N) + N函数,或使用std::map计算列表中的每个元素(线性,+ N内存(在最坏的情况下))。

答案 1 :(得分:1)

  

请注意,只有元素与其前面的元素进行比较时,才会从列表容器中删除该元素。因此,此功能对排序列表特别有用。

所以你必须事先对列表进行排序,或者使用std :: set(本质上的set不能包含重复的对象)。

答案 2 :(得分:1)

如果不要求使用std::list,那么我建议使用std::set,这将不允许您insert已经在该集合中的元素。此外,insert方法将通过其返回值让您知道您尝试插入的元素是否已经在集合中。

如果要求使用std::list,我建议您使用std::unique算法清除重复项。请看那里的例子。