2010-09-17 5 views
10

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

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

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

+1

Поскольку вы имеете дело со списками, я хочу указать, что std :: list имеет функцию сортировки элементов, которая имеет лучшую производительность, чем std :: sort в списке. –

+0

и да только что заново открыли, std :: list также имеет уникальную функцию-член, что означает, что это предпочтительнее, чем std :: unique. –

+0

Спасибо Amit за это, но я не использую std :: list <> много (по совету Херба Саттера, что std :: vector в большинстве случаев является «правильным» контейнером для использования, даже в стандарте C++ существует такой рекомендацию см. в разделе 23.1.1/2). –

ответ

11

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

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

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

+0

Это точно, но я бы использовал QSet <> напрямую.Обычно я предпочитаю последовательные контейнеры (которые в большинстве случаев являются наиболее подходящим выбором), поэтому QSet <> или std :: set можно считать излишним. –

+0

Я думаю, это вопрос вкуса: если мне нужно сохранить список элементов без дубликатов, я всегда выбираю набор. Однако я никогда не сравнивал производительность. –

+1

Ну, я часто использовал 'std :: set' или' std :: map', пока мне не пришлось бороться с проблемами производительности. Теперь я думаю дважды, прежде чем идти этим путем ;-). –

1

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

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

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

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

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

С QVector это, кажется, работы ...

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

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

От обратной ссылки назад o list:

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

QList<QString> list = vect.toList(); 
// list: ["red", "green", "blue", "black"] 
Смежные вопросы