2013-12-17 215 views
2

我有下面列出的代碼,我試圖從字符串向量中刪除任何重複的橄欖球隊名稱。但是,它只是有時會起作用,它會刪除某些團隊的重複名稱;但對其他人來說,最終陣列中會出現多次相同的球隊名稱。刪除字符串向量中的重複字符串

例如,它會打印:

aresnal 
wigan 
villa 
liverpool 
villa 

注意有兩個「別墅」的名字,任何人都可以給我一個建議? 'finalLeague'是存儲所有名稱的數組,並且是需要刪除重複項的數組。

for (int i = 0;i < finalLeague.size();i++) 
    {  
     string temp = finalLeague[i]; 
     int h = i + 1; 
     for (int j = i+1;j < finalLeague.size();j++) 
     { 
      if (finalLeague[j] == finalLeague[i]) 
      {    
       finalLeague.erase(finalLeague.begin()+j);  
      }  
     } 
    } 
+0

添加元素時很容易檢查:如果元素已經存在,請不要添加它。 – unfamous

回答

6

當然,你可以使用std::sortstd::uniquestd::vector::erase組合:

std::sort(finalLeague.begin(), finalLeague.end()); 
auto it = std::unique(finalLeague.begin(), finalLeague.end()); 
finalLeague.erase(it, finalLeague.end()); 

另外,使用不接受重複擺在首位的容器:

std::set<std::string> finalLeague;   // BST, C++03 and C++11 
std::unordered_set<std::string> finalLeague; // hash table, C++11 
0

你應該使用std :: unique

std::vector<std::string> vec; 
// filling vector 
// .... 

std::vector<std::string>::iterator it; 
it = std::unique (vec.begin(), vec.end()); 
vec.resize(std::distance(vec.begin(),it)); 

@edit:正如@Gorpik所說的,在使用std :: unique之前必須對vector進行排序,否則只有相等的連續元素纔會被刪除。

+1

'std :: unique'只能刪除連續的重複項。在使用之前,您需要對矢量進行排序。 – Gorpik

+0

你是對的,我忘了排序向量。 – Jepessen

0

這也可以使用散列圖完成。使用#include <unordered_map>可以讓你使用它。請注意,您可能必須使用C++ 11。閱讀有關無序地圖here

您需要做的就是檢查字符串是否曾經發生過,並繼續將唯一字符串推入新的向量。

這種方法的USP是它需要最少量的代碼。只需一個循環就可以做到這一點。

+0

自C++ 11以來它不可用。從C++ 11開始,它就被正式標準化了。很久以前,它在許多流行的C++編譯器中作爲擴展使用。 – luk32

+0

哦!我不知道!謝謝,我會改變它。 – Ranveer

+0

在gcc中它已經在3.4中作爲'hash_map'出現了。在更改日誌中有一個[錯誤修正報告](http://gcc.gnu.org/gcc-3.4/changes.html)。這可以追溯到2006年。我相信vC++有類似的東西。但是,當然可能會有差異,但我的觀點是,如果有一個老版本的pre-C++ 11編譯器,他們不應該因爲需要類似的功能而感到氣餒。 – luk32