2017-08-03 17 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運算符或函數。