2017-08-03 18 views
0

据我了解快速排序,如果成员的洗牌与拷贝构造函数完成后,你会由什么Øñ LN n为非常失望)的意思。所以我决定测试qSortQt的:快速排序,而无需使用拷贝构造函数

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的(常量的QObject &)' 是私有

错误。从我所知道的,问题与begin()方法开始,因为如果我有

list.begin(); 

编译器错误表明该qlist.h线以某种方式试图使用拷贝构造函数:

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

我意识到我可以创建列表的成员指针,然后实现lessThan函数,但这对于此代码库不太方便。那么,如何在qSort在对象列表上操作时避免使用复制ctor?

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

+1

我不使用qt,但可以设置一组从0到最大项目数-1的索引。然后,对索引进行排序,而不是对列表进行排序,并使用它来引用数据。 – PaulMcKenzie

+0

@PaulMcKenzie比使用指针更好吗? – Opux

+0

是的,它比指针“更好”,因为它不需要指针。我可以发布一个答案,但它将适用于使用'std :: sort'和'vector',而不是Qt(但是我相信这个原则是相同的)。 – PaulMcKenzie

回答

0

因为我不是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函数作为第三个参数。如果有问题,可以使用函数对象。

+0

这与排序指针基本相同,指针是索引,但指针的间接性较差。 – MofX

0

QObject既没有拷贝构造函数也没有赋值操作符。这是设计。

http://doc.qt.io/qt-4.8/qobject.html#no-copy-constructor-or-assignment-operator

所以你就不能qSort以前C++ 11 QObject S或派生类,至少不是在C++中的容器。您可以尝试在编译器中切换C++ 11支持(或更高版本)(并确保您的Qt库也可以编译);如果Qt的人们像往常一样好,他们在这种情况下使用move semantics

否则使用指针或可能是Qt指针类之一如QSharedPointer将是一种有效的方法。如果您不希望按内存地址排序,您无论如何都需要一个lessThan运算符或函数。