C++ Qt:qSort不使用复制构造函数

C++ Qt:qSort不使用复制构造函数,c++,qt,sorting,qt4,qt4.8,C++,Qt,Sorting,Qt4,Qt4.8,正如我对快速排序的理解,如果成员的洗牌是用copy-ctor完成的,那么你会对O(n-ln-n)的真正含义感到非常失望。所以我决定用它来测试 编译器错误表明此qlist.h行试图以某种方式使用复制ctor: inline void detach() { if (d->ref != 1) detach_helper(); } 我意识到我可以创建列表的成员指针,然后实现该函数,但这对于这个代码库来说不是很方便。那么,当qSort对对象列表进行操作时,如何避免使用copy-ctor呢 我在Li

正如我对快速排序的理解,如果成员的洗牌是用copy-ctor完成的,那么你会对O(n-ln-n)的真正含义感到非常失望。所以我决定用它来测试

编译器错误表明此qlist.h行试图以某种方式使用复制ctor:

inline void detach() { if (d->ref != 1) detach_helper(); }
我意识到我可以创建列表的成员指针,然后实现该函数,但这对于这个代码库来说不是很方便。那么,当
qSort
对对象列表进行操作时,如何避免使用copy-ctor呢


我在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];});
}
注意:我假设
qSort
接受lambda函数作为第三个参数。如果有问题,可以使用函数对象

QObject既没有复制构造函数也没有赋值运算符。这是故意的

<> P> >您不能只使用代码> > QObjult<代码> >或派生类,至少在C++ 11之前没有C++。您可以尝试在编译器中打开C++11支持(或更高版本)(并确保您的Qt库也使用该支持编译);如果Qt人员像往常一样好,他们在本例中使用


否则,使用指针或Qt指针类(如
QSharedPointer
)将是一种有效的方法。如果您不想按内存地址排序,那么无论如何都需要一个小于的运算符或函数。

我不使用qt,但您可以设置一组从0到最大项数-1的索引。然后对索引进行排序,而不是列表,并使用它来引用数据。@PaulMcKenzie这比使用指针好吗?是的,它比指针“好”,因为它不需要指针。我可以发布一个答案,但它将面向使用
std::sort
vector
,而不是Qt(但我相信同样的原则也适用)。文档说它需要项类型来实现运算符,它本质上与排序指针相同,指针是索引,除了指针的间接性较少。
inline void detach() { if (d->ref != 1) detach_helper(); }
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[index[0]]; // First item
myList[index[1]]; // second item
...