gpt4 book ai didi

c++ - 删除字符串 vector 中的重复项

转载 作者:可可西里 更新时间:2023-11-01 15:03:31 26 4
gpt4 key购买 nike

我有一个字符串 vector :

std::vector<std::string> fName

其中包含文件名列表 <a,b,c,d,a,e,e,d,b> .

我想去掉所有有重复的文件,只保留 vector 中没有重复的文件。

for(size_t l = 0; l < fName.size(); l++)
{
strFile = fName.at(l);
for(size_t k = 1; k < fName.size(); k++)
{
strFile2 = fName.at(k);
if(strFile.compare(strFile2) == 0)
{
fName.erase(fName.begin() + l);
fName.erase(fName.begin() + k);
}
}
}

这将删除一些重复项,但仍然有一些重复项,需要帮助进行调试。

而且我的输入看起来像<a,b,c,d,e,e,d,c,a>我的预期输出是 <b>因为所有其他文件 b、c、d、e 都有重复项,所以它们被删除了。

最佳答案

#include <algorithm>

template <typename T>
void remove_duplicates(std::vector<T>& vec)
{
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
}

注意:这要求 T 有 operator<operator==定义。

为什么有效?

std::sort使用小于比较运算符对元素进行排序

std::unique删除重复的连续元素,使用相等比较运算符比较它们

如果我只想要独特的元素怎么办?

那么你最好使用 std::map

#include <algorithm>
#include <map>

template <typename T>
void unique_elements(std::vector<T>& vec)
{
std::map<T, int> m;
for(auto p : vec) ++m[p];
vec.erase(transform_if(m.begin(), m.end(), vec.begin(),
[](std::pair<T,int> const& p) {return p.first;},
[](std::pair<T,int> const& p) {return p.second==1;}),
vec.end());
}

参见:here .

关于c++ - 删除字符串 vector 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com