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

C++ 删除字符串向量中的重复项,c++,vector,C++,Vector,我有一个字符串向量: std::vector<std::string> fName std::vector fName 其中包含文件名列表 我想去掉所有有重复项的文件,只保留向量中没有重复项的文件 for(size_t l = 0; l < fName.size(); l++) { strFile = fName.at(l); for(size_t k = 1; k < fName.size(); k++) { strFile2

我有一个字符串向量:

std::vector<std::string> fName
std::vector fName
其中包含文件名列表

我想去掉所有有重复项的文件,只保留向量中没有重复项的文件

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);
        }
    }
}
(size_t l=0;l { strFile=fName.at(l); 对于(size_t k=1;k 这将删除一些副本,但仍保留一些副本,需要调试方面的帮助

另外,我的输入看起来像
,我的预期输出是
,因为所有其他文件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());
}

请参阅:。

如果我正确理解您的要求,并且我不能完全确定我是否理解。你想只保留向量中不重复的元素,对吗

将字符串映射到整数,用于计算每个字符串的出现次数。清除该向量,然后仅复制只出现一次的字符串

map<string,int> m;
for (auto & i : v)
    m[i]++;
v.clear();
for (auto & i : m)
    if(i.second == 1)
        v.push_back(i.first);
map-m;
用于(自动和i:v)
m[i]++;
v、 清除();
用于(自动和输入:m)
如果(i.second==1)
v、 向后推(即先推);
或者,对于被质疑的编译器功能:

map<string,int> m;
for (vector<string>::iterator i=v.begin(); i!=v.end(); ++i)
    m[*i]++;
v.clear();
for (map<string,int>::iterator i=m.begin(); i!=m.end(); ++i)
    if (i->second == 1)
        v.push_back(i->first);
map-m;
对于(向量::迭代器i=v.begin();i!=v.end();++i)
m[*i]++;
v、 清除();
for(map::iterator i=m.begin();i!=m.end();++i)
如果(i->second==1)
v、 向后推(i->first);
#包括
模板
删除重复项(标准::向量和向量)
{
std::向量tvec;
uint32_t size=vec.size();
对于(uint32_t i;i
您可以消除O(日志n)运行时和O(n)空间中的重复项:

上面的算法获取一个排序范围并返回第一个唯一的元素,以线性时间和常量空间表示。要在容器中获取所有Unique,可以这样使用:

auto pivot = vec.begin();
for( auto i(find_unique(vec.begin(), vec.end()));
     i != vec.end();
     i = find_unique(++i, vec.end())) {
    std::iter_swap(pivot++, i);
}
vec.erase(pivot, vec.end());

你想保留副本吗?也就是说,你想要,还是仅仅?我不想保留副本。还需要包括#include for std::sort和std::unique to work。Gigi感谢你,这已经奏效,但没有解决我原来的问题。。。我从我希望我的输出开始,不抱歉,我希望我的输出不会重复。您使用
std::set
的解决方案与您使用
std::sort/unique
@gigigigi的解决方案做了相同的事情。谢谢您,这已经成功,但没有解决我原来的问题。。。我开始时希望我的输出是,而不是
std::vector
没有
pop\u front()
只有pop\u back()找不到pop\u front()。如果你能帮忙,林德利先生会很高兴的。非常感谢。perreal@DeepakB例如我帮忙了。你看不到我的答案吗?坦率地说,我会选择
std::sort()
std::unique()
方法。我只是觉得我应该展示另一种选择。:)在任何情况下(性能等),这都是一个可怕的例子,对于那些懒得不检查算法库的人来说,闻起来像是一个解决办法
#include <algorithms>

template <typename T>
remove_duplicates(std::vector<T>& vec)
{
  std::vector<T> tvec;
  uint32_t size = vec.size();
  for (uint32_t i; i < size; i++) {
    if (std::find(vec.begin() + i + 1, vec.end(), vec[i]) == vector.end()) {
      tvec.push_back(t);
    } else {
      vec.push_back(t);
    }
  vec = tvec; // : )
  }
}
std::set<std::string> const uniques(vec.begin(), vec.end());
vec.assign(uniques.begin(), uniques.end());
template<typename In>
In find_unique(In first, In last)
{
    if( first == last ) return last;
    In tail(first++);
    int dupes = 0;
    while( first != last ) {
        if( *tail++ == *first++ ) ++dupes;
        else if( dupes != 0 ) dupes = 0;
        else return --tail;
    }
    return dupes == 0 ? tail : last;
}
auto pivot = vec.begin();
for( auto i(find_unique(vec.begin(), vec.end()));
     i != vec.end();
     i = find_unique(++i, vec.end())) {
    std::iter_swap(pivot++, i);
}
vec.erase(pivot, vec.end());