【问题标题】:C++ finding doubles in listC ++在列表中查找双打
【发布时间】:2013-05-22 16:12:04
【问题描述】:

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

我尝试了listunique() 函数,并在我的班级中添加了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 );
}

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

【问题讨论】:

标签: c++ list compare


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2021-03-14
        • 2014-02-10
        • 2012-09-26
        • 1970-01-01
        相关资源
        最近更新 更多