我有一个 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::unique
与 Qt 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/