2010-09-17 46 views
10

刪除重複多年來,我已經使用以下模式從C++ std::vector類型的對象刪除重複:從的QList

std::vector<int> cont; 
std::sort(cont.begin(), cont.end()); 
cont.erase(std::unique(cont.begin(), cont.end()), cont.end()); 

現在我想知道如果相同的範例是將要使用的一個與Qt QList<>類,或者如果有一個更優雅的方式來做到這一點。

+1

正如你在處理列表,我想指出std :: list有一個成員排序函數,它比列表上的std :: sort具有更好的性能。 – 2010-09-17 08:56:55

+0

和是剛剛重新發現,std :: list也有'唯一'成員函數,這意味着它優於std :: unique。 – 2010-09-17 08:58:30

+0

感謝Amit指出了這一點,但我並沒有太多地使用std :: list <>(遵循Herb Sutter的建議std :: vector在大多數情況下都是「正確的」容器;即使在C++標準中也有這樣的一項建議,見23.1.1/2)。 – 2010-09-17 09:31:17

回答

11

我不知道性能,但將QList轉換爲QSet怎麼樣?

QList<int> myQList; 
//... 
QSet<int> = QSet::fromList(myQList); 
// or 
QSet<int> = myQList.toSet(); 

(如果需要用QList::fromSet()可能將其轉換回一個QList

+0

這是一種方式,當然,但是我會直接使用QSet <>。我通常更喜歡順序容器(大多數時候是最合適的選擇),所以QSet <>或std :: set可以被認爲是一種矯枉過正。 – 2010-09-17 09:33:58

+0

我想這是一個味道問題:如果我需要存儲一個沒有重複的元素列表,我總是選擇一組。我從來沒有比較過的表現。 – 2010-09-17 10:39:15

+1

嗯,我過去常常使用'std :: set'或'std :: map',直到我不得不面對性能問題。現在我在考慮這種方式之前先考慮一下;-)。 – 2010-09-18 19:13:26

1

如果要創建這個列表:

然後避免重複可能是一個可行的替代刪除重複。

QList<int> cont; 
int incomingValue; 
if(!cont.contains(incomingValue)) 
{ 
    cont.append(incomingValue); 
} 

此外,由於這是一個大約的QList <>(不僅的QList < int>的)的問題...

一些可以使用自定義的類,並喜歡以避免重複。

class SoftDrink 
{ 
public: 
    int oz 
    QString flavor 
    bool operator==(const Beverage &other) const{ 
     uint hash = qHash(flavor)^oz; 
     uint otherHash = qHash(other.flavor)^other.oz; 
     return hash == otherHash; 
    } 
} 

==操作符像一個以上的可允許的QList評估對自定義數據類型

QList<SoftDrink> uniquePurchaseHistory; 
SoftDrink newPurchase; 
if(!uniquePurchaseHistory.contains(newPurchase)){ 
    uniquePurchaseHistory.append(newPurchase); 
} 
0

的contains()方法不附帶:

隨着QVector似乎工作...

QVector<int> v; 
std::sort(v.begin(), v.end()); 

v.erase(std::unique(v.begin(), v.end()), v.end());//remove duplicates 

從矢量返回t O列表:

QVector<QString> vect; 
vect << "red" << "green" << "blue" << "black"; 

QList<QString> list = vect.toList(); 
// list: ["red", "green", "blue", "black"]