删除字符串向量中的重复项

Dee*_*k B 11 c++ vector

我有一个字符串向量:

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)

见:这里.