多年来,我一直使用以下模式从C ++ std::vector
类型的对象中删除重复项:
std::vector<int> cont;
std::sort(cont.begin(), cont.end());
cont.erase(std::unique(cont.begin(), cont.end()), cont.end());
现在我想知道相同的范例是否与Qt QList<>
类一起使用,或者是否有更优雅的方法来实现它。
答案 0 :(得分:13)
我不了解性能,但将QList
转换为QSet
呢?
QList<int> myQList;
//...
QSet<int> = QSet::fromList(myQList);
// or
QSet<int> = myQList.toSet();
(如果需要,可以使用QList::fromSet())将其转换为QList
答案 1 :(得分:2)
如果您要创建此列表:
然后避免重复可能是删除重复项的可行替代方案。
QList<int> cont;
int incomingValue;
if(!cont.contains(incomingValue))
{
cont.append(incomingValue);
}
此外,由于这是一个关于QList&lt; &GT; (而不仅仅是QList&lt; int&gt;)...
有些人可能正在使用自定义类,并且喜欢避免重复。
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针对自定义数据类型评估contains()方法
QList<SoftDrink> uniquePurchaseHistory;
SoftDrink newPurchase;
if(!uniquePurchaseHistory.contains(newPurchase)){
uniquePurchaseHistory.append(newPurchase);
}
答案 2 :(得分:0)
没有保修:
使用QVector似乎有效......
QVector<int> v;
std::sort( v.begin(), v.end() );
v.erase( std::unique(v.begin(), v.end() ), v.end() );//remove duplicates
从Vector回到列表:
QVector<QString> vect;
vect << "red" << "green" << "blue" << "black";
QList<QString> list = vect.toList();
// list: ["red", "green", "blue", "black"]