刪除重複多年來,我已經使用以下模式從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<>
類,或者如果有一個更優雅的方式來做到這一點。
刪除重複多年來,我已經使用以下模式從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<>
類,或者如果有一個更優雅的方式來做到這一點。
我不知道性能,但將QList
轉換爲QSet
怎麼樣?
QList<int> myQList;
//...
QSet<int> = QSet::fromList(myQList);
// or
QSet<int> = myQList.toSet();
(如果需要用QList::fromSet()可能將其轉換回一個QList
)
這是一種方式,當然,但是我會直接使用QSet <>。我通常更喜歡順序容器(大多數時候是最合適的選擇),所以QSet <>或std :: set可以被認爲是一種矯枉過正。 – 2010-09-17 09:33:58
我想這是一個味道問題:如果我需要存儲一個沒有重複的元素列表,我總是選擇一組。我從來沒有比較過的表現。 – 2010-09-17 10:39:15
嗯,我過去常常使用'std :: set'或'std :: map',直到我不得不面對性能問題。現在我在考慮這種方式之前先考慮一下;-)。 – 2010-09-18 19:13:26
如果要創建這個列表:
然後避免重複可能是一個可行的替代刪除重複。
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);
}
的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"]
正如你在處理列表,我想指出std :: list有一個成員排序函數,它比列表上的std :: sort具有更好的性能。 – 2010-09-17 08:56:55
和是剛剛重新發現,std :: list也有'唯一'成員函數,這意味着它優於std :: unique。 – 2010-09-17 08:58:30
感謝Amit指出了這一點,但我並沒有太多地使用std :: list <>(遵循Herb Sutter的建議std :: vector在大多數情況下都是「正確的」容器;即使在C++標準中也有這樣的一項建議,見23.1.1/2)。 – 2010-09-17 09:31:17