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());