从QList中删除重复项

时间:2010-09-17 08:42:27

标签: c++ qt

多年来,我一直使用以下模式从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<>类一起使用,或者是否有更优雅的方法来实现它。

3 个答案:

答案 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"]