我必须找到我的list<SnakeParts>
中是否有双打,并且如果有双打则将其设置为false
我尝试使用unique()
的{{1}}功能,并为我的班级添加了list
。
现在,当我执行唯一功能时,我不会过滤掉双打。经过一些调试后,我发现operator==()
比较器只被执行了多次,因为我的列表中有对象,我使用了以下代码:
==
运算符:
list<SnakePart> uniquelist = m_snakeParts;
uniquelist.unique();
if (m_snakeParts.size() != uniquelist.size()){
alive = false;
}
但这不起作用。那么我做错了什么,还是有另外一种方法可以做到这一点?
答案 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
算法清除重复项。请看那里的例子。