Удаление дубликатов из 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"]