删除字符串向量中的重复字符串

时间:2013-12-17 12:54:47

标签: c++ vector

我有下面列出的代码,我试图从字符串向量中删除任何重复的足球队名称。但是,它只是有时工作,它将删除一些团队的重复名称;但是对于其他人来说,最终数组中会出现多次相同的团队名称。

例如,它会打印:

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);     
          }     
      }
  }

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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进行排序,否则只会删除相等的连续元素。

答案 2 :(得分:0)

这也可以使用hashmap完成。使用#include <unordered_map>可以让您使用它。请注意,可能必须使用C++ 11。阅读无序地图here

您需要做的就是检查字符串是否在之前发生过,并继续将唯一字符串推送到新的向量中。

此方法的USP是它需要最少量的代码。只需一个循环即可。