gpt4 book ai didi

c++ - Qt:不使用复制构造函数的qSort

转载 作者:行者123 更新时间:2023-11-28 05:03:02 25 4
gpt4 key购买 nike

据我了解快速排序,如果成员的洗牌是用复制 ctor 完成的,你会对 O(n ln n) 的真正意思。所以我决定测试qSort

QList<QObject> mylist;   //Yes, I know this isn't feasible, I just wanted to find where the copy ctor is being used
qSort(list);

并被那些击中

'QObject::QObject(const QObject&)' is private

错误。据我所知,问题始于 begin() 方法,因为如果我有

list.begin();

编译器错误表明此 qlist.h 行以某种方式尝试使用复制构造函数:

inline void detach() { if (d->ref != 1) detach_helper(); }

我意识到我可以创建列表的成员指针,然后实现 lessThan功能,但这对于这个代码库来说不是很方便。那么当 qSort 对对象列表进行操作时,如何避免使用复制构造函数呢?

我在 Linux 64 位和 32 位上使用 Qt 4.8。

最佳答案

我会尝试一下,因为我不是 Qt 用户。

通常,如果您需要对无法复制的对象列表进行排序,或者如果复制方面的开销很大,一种解决方法是对索引列表而不是数据进行排序,排序完成后,使用访问数据的索引列表。

根据 Qt 的 qSort 文档,使用上面的方法可能会这样:

int doSomething()
{
QList<QObject> myList;
//...
QVector<int> index(myList.size());
for (int i = 0; i < myList.size(); ++i ) index[i] = i;
qSort(index.begin(), index.end(), [](int n1, int n2) { return myList[n1] < myList[n2];});
}

完成此操作后,您将访问已排序的 myList 容器:

myList[index[0]]; // First item
myList[index[1]]; // second item
...

注意:我假设 qSort 接受一个 lambda 函数作为第三个参数。如果有问题,您可以使用函数对象。

关于c++ - Qt:不使用复制构造函数的qSort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45490707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com