2013-05-10 4 views
7

Просто хочу удалить дубликаты. Бассейн vector<pair<string, int>>, но я как будто пропустил некоторые элементы в начале вектора. Может ли кто-нибудь проверить логику удаления? Спасибо :)Удалить повторяющиеся записи в C++-векторе

Pool Master::eliminateDuplicates(Pool generation) 
{ 
    for(int i = 0; i < generation.size(); i++) 
    { 
     string current = generation.at(i).first; 

     for(int j = i; j < generation.size(); j++) 
     { 
      if(j == i) 
      { 
       continue; 
      } 
      else 
      { 
       string temp = generation.at(j).first; 
       if(current.compare(temp) == 0) 
       { 
        Pool::iterator iter = generation.begin() + j; 
        generation.erase(iter); 
       } 
      } 
     } 
    } 

    return generation; 
} 
+1

Не возражаете, если он будет отсортирован? – chris

+0

Eww, те копии ... –

+1

Простой (и, скорее всего, более быстрый способ, чем метод 'O (n^2), который он в настоящее время принимает) заключается в добавлении всех элементов в' std :: set', а затем вернуться к 'std :: vector'. – Yuushi

ответ

4

Это очень распространенная проблема.

Потому что после удаления элемента позиция j будет пропущена один элемент из-за j ++ в цикле for. самое простое решение, чтобы решить эту проблему, основанный на коде, чтобы добавить j-- после generation.erase (ИТЭР):

generation.erase(iter); 
    j--; 
+0

Спасибо, вот и все. : D – T3CHN0CR4T

19

Если вы не возражаете сортировки вектора, то вы можете использовать std::unique. Это будет O (Nlog (N))

#include <iostream> 
#include <algorithm> 
#include <vector> 

int main() 
{ 
    std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7}; 
    std::sort(v.begin(), v.end()); 
    auto last = std::unique(v.begin(), v.end()); 
    v.erase(last, v.end()); 
    for (const auto& i : v) 
     std::cout << i << " "; 
    std::cout << "\n"; 
} 
+6

+1 Кто-то должен написать wiki/FAQ для всех применений вектора хлеба и масла. – TemplateRex

+0

@rhalbersma, согласился. –

+2

@rhalbersma, SO должен поддерживать список наиболее часто задаваемых вопросов по популярным темам, таким как Top 10 C++ Questions или что-то еще. Это было бы удобно. : D – T3CHN0CR4T

Смежные вопросы