2

我必须找出我的是否有双打,如果有双打list<SnakeParts>则设置为 false

我尝试了 the 的unique()功能list并将 an 添加operator==()到我的课程中。现在,当我执行独特的功能时,我不会过滤掉双打。经过一些调试后,我发现==比较器的执行次数与列表中的对象一样多,我使用了以下代码:

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

操作员:

bool SnakePart::operator==(const SnakePart& snakePart) const{
    return (x == snakePart.x && y == snakePart.y );
}

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

4

3 回答 3

2

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

于 2013-05-22T16:17:20.110 回答
1

请注意,只有当一个元素与它之前的元素比较相等时,它才会从列表容器中删除。因此,此函数对于排序列表特别有用。

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

于 2013-05-22T16:17:16.997 回答
1

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

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

于 2013-05-22T16:17:42.410 回答