我有一个字符串向量:
std::vector<std::string> fName
Run Code Online (Sandbox Code Playgroud)
它包含文件名列表<a,b,c,d,a,e,e,d,b>.
我想摆脱所有具有重复项的文件,并希望仅保留向量中没有重复项的文件.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是删除一些副本但仍有一些重复,需要帮助调试.
此外,我的输入看起来<a,b,c,d,e,e,d,c,a>和我的预期输出是<b>所有其他文件b,c,d,e有重复删除它们.
Gig*_*igi 16
#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());
}
Run Code Online (Sandbox Code Playgroud)
注意:这要求T具有operator<并operator==定义.
它为什么有效?
std :: sort使用less-than比较运算符对元素进行排序
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());
}
Run Code Online (Sandbox Code Playgroud)
见:这里.
| 归档时间: |
|
| 查看次数: |
13487 次 |
| 最近记录: |