我有下面列出的代码,我试图从字符串向量中删除任何重复的足球队名称。但是,它只是有时工作,它将删除一些团队的重复名称;但是对于其他人来说,最终数组中会出现多次相同的团队名称。
例如,它会打印:
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 :(得分:6)
当然,您可以使用std::sort
,std::unique
和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
答案 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是它需要最少量的代码。只需一个循环即可。