Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除字符串向量中的重复字符串_C++_Vector - Fatal编程技术网

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

C++ 删除字符串向量中的重复字符串,c++,vector,C++,Vector,我有下面列出的代码,我试图从字符串向量中删除任何重复的足球队名称。然而,它只是偶尔起作用,它会删除一些团队的重复名称;但对于其他人,在最终数组中会多次出现相同的团队名称 例如,它将打印: aresnal wigan villa liverpool villa 注意这里有两个“别墅”的名字,有人能给我一个建议吗? “finalLeague”是存储所有名称的数组,也是需要从中删除重复项的数组 for (int i = 0;i < finalLeague.size();i++) {

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

例如,它将打印:

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);     
          }     
      }
  }
for(int i=0;i
当然,您可以结合使用
std::sort
std::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
std::set finalLeague;//BST、C++03和C++11
std::无序集最终结果;//哈希表,C++11

您应该使用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)); 
std::向量向量向量机;
//填充向量
// ....
std::vector::it迭代器;
it=std::unique(vec.begin(),vec.end());
调整向量大小(std::distance(vec.begin(),it));

@编辑:正如@Gorpik所说的,在使用std::unique之前必须对vector进行排序,否则将只删除相等的连续元素。

这也可以使用hashmap来完成。使用
#include
将允许您使用它。请注意,您可能必须使用
C++11
来实现它。阅读无序地图

您所需要做的就是检查字符串是否在之前出现,并将唯一的字符串不断推送到新的向量中


这种方法的USP是它需要最少的代码量。只要一个循环就可以了。

自从c++11以来,它就不可用了。它从c++11开始正式标准化。它在很多流行的C++编译器中都是很长时间以来的扩展。我不知道!谢谢,我会更改它。在gcc中,它已经在3.4中以
hash\u map
的形式出现。有一个问题。这可以追溯到2006年。我相信vc++也有类似的功能。但是当然可能会有差异,尽管我的观点很简单,如果一个人有和旧的c++11之前的编译器,他们不应该因为需要类似的功能而气馁。
std::map
也可以工作。最初重要的是
map
部分,而不是实现细节。我想我的答案应该是他也可以使用hashmaps。
std::unique
只删除连续的重复项。在使用向量之前,您需要对其进行排序。添加元素时很容易检查:如果元素已经存在,请不要添加它。