2013-05-10 45 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