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
只删除连续的重复项。在使用向量之前,您需要对其进行排序。添加元素时很容易检查:如果元素已经存在,请不要添加它。