2013-12-17 160 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