2010-09-17 52 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"]