Удаление дубликатов из QList

В течение многих лет я использовал следующий шаблон для удаления дубликатов из объекта типа С++ std::vector:

std::vector<int> cont;
std::sort(cont.begin(), cont.end());
cont.erase(std::unique(cont.begin(), cont.end()), cont.end());

Теперь мне интересно, будет ли та же парадигма использоваться с классом Qt QList<>, или если есть более элегантный способ сделать это.

Ответ 1

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

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

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

Ответ 2

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

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

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 оценивать метод contains() в отношении настраиваемого типа данных

QList<SoftDrink> uniquePurchaseHistory;
SoftDrink newPurchase;
if(!uniquePurchaseHistory.contains(newPurchase)){
    uniquePurchaseHistory.append(newPurchase);
}

Ответ 3

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

С 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"]