2013-05-10 47 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 2013-05-10 06:01:33

+0

Eww,那些副本...... – 2013-05-10 06:03:54

+1

这样做比较容易(也许比它当前所用的'O(n^2)'方式更快),将所有元素添加到“std :: set”,然后回到'std :: vector'。 – Yuushi 2013-05-10 06:03:55

回答

4

这是一个非常普遍的问题。

因为擦除元素后,由于for循环上的j ++,j指向的位置将跳过一个元素。 解决基于你的代码问题的最简单的方法是后generation.erase(ITER)添加j--:

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

谢谢,就是这样。 :D – T3CHN0CR4T 2013-05-10 06:33:51

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 2013-05-10 06:32:50

+0

@rhalbersma,同意。 – 2013-05-10 08:22:06

+2

@rhalbersma,SO应该保留一个关于流行话题的最常见问题列表,比如Top 10 C++ Questions或其他。那会很方便。 :D – T3CHN0CR4T 2013-05-10 12:48:02