我有一个 QList<MyData> ,其中 MyData 有 2 个成员, int id (unique) 和 QString name 。我想根据 name 删除所有重复条目,并且该条目必须是具有相同 id 的其他对象之间的最高 name 。关于如何以最快的方式做到这一点的任何建议?性能在这里是一个非常重要的因素。

在谷歌搜索了一整天之后我的一些想法:

  • qStableSort() 它基于 id(降序),然后遍历 QList ,然后对于每个条目,当新的 QList 上不存在 name 时,将条目复制到另一个新的 QList
  • 使用 QList::toSet(删除所有重复条目),并提供 operator==() 和基于 name 的 qHash() 实现,但唯一条目可能没有最高 id
  • 使用 std::list::unique ,但我不确定它是如何工作的。
  • 最佳答案

    std::list::unique 可以将具有以下属性的函数作为参数:



    因此,在您的情况下,您可以使用以下功能:

    bool shouldRemove(MyData first, MyData second)
    {
        // remove only if they have the same name and the first id
        // is smaller than the second one
        return ( first.name == second.name &&
                 first.id <= second.id );
    }
    

    简单地称之为做,
    std::list<MyData> myList = qlist.toStdList();
    myList.unique(shouldRemove)
    

    请注意,您需要先对 std::list 进行排序

    编辑

    似乎您可以将 std::uniqueQt containers 一起使用(如果 Qt 是使用 STL 支持构建的)。因此,在这种情况下,您可以执行以下操作:
    // lessThan is a function that sorts first by name and then by id
    qSort(qList.begin(), qList.end(), lessThan );
    QList<MyData>::iterator it = std::unique (qList.begin(), qList.end(), shouldRemove);
    qList.erase(it, qList.end());
    

    关于c++ - 从 QList 中删除重复对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14319474/

    10-10 19:52