删除重复多年来,我已经使用以下模式从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