Удаление дубликатов из QList - PullRequest
13 голосов
/ 17 сентября 2010

В течение многих лет я использовал следующий шаблон для удаления дубликатов из объекта типа 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 ]

13 голосов
/ 17 сентября 2010

Я не знаю о производительности, но как насчет преобразования QList в QSet?

QList<int> myQList;
//...
QSet<int> = QSet::fromList(myQList);
// or
QSet<int> = myQList.toSet();

(и, возможно, преобразовать его обратно в QList при необходимости с помощью QList :: fromSet () )

2 голосов
/ 13 декабря 2016

Если вы создаете этот список:

Тогда избегание дубликатов может быть жизнеспособной альтернативой удалению дубликатов.

QList<int> cont;
int incomingValue;
if(!cont.contains(incomingValue))
{
    cont.append(incomingValue);
}

Кроме того, поскольку речь идет о QList <> (а не только о QList ) ...

Некоторые могут использовать пользовательский класс и предпочитают избегать дубликатов.

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);
}
0 голосов
/ 15 августа 2017

Без гарантии:

С QVector, похоже, работает ...

QVector<int> v;
std::sort( v.begin(), v.end() );

v.erase( std::unique(v.begin(), v.end() ), v.end() );//remove duplicates

Из вектора обратно в список:

QVector<QString> vect;
vect << "red" << "green" << "blue" << "black";

QList<QString> list = vect.toList();
// list: ["red", "green", "blue", "black"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...