在维护顺序的同时从std::vector中删除/擦除重复元素的方法
Way to delete/erase duplicate elements from std::vector while maintaining order?
有没有一种方法可以在维护顺序的同时从包含字符串元素的向量容器中删除重复元素。
到目前为止,我已经使用了set方法,但它没有保留顺序。
对于这个问题,我不知道如何使用remove_if。
如何使用临时容器:
std::vector< int >::iterator i , j ;
std::set< int > t_set;
for( i = v.begin() , j = v.begin() ; i != v.end() ; ++i )
if( t_set.insert( *i ).second)
*j++ = *i ;
v.erase( j , v.end() );
使用std::remove_if
,我可以想到:
std::set<int> t_set;
std::vector<int> res; //Resultant vector
remove_copy_if(v.begin(), v.end(), std::back_inserter(res),
[&t_set](int x){
return !t_set.insert(x).second;
} );
您可以创建一个空数组,然后迭代原始向量,只复制向量中每个项的第一个实例。通过将项目添加到集合中,并在将其添加到新数组之前检查集合中是否存在项目,可以跟踪是否已在向量中看到该项目。
您可以这样做:
std::vector<int> v = { 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 8 };
// 1 2 2 3 4 5 6 7 8 9 8
for(size_t i=0;i<v.size();i++)
{
for(size_t j=0;j<v.size();j++)
{
if(v[i] == v[j] && i != j)
{
v.erase(v.begin()+j);
j--; // Fix for certain datasets ie:
} // 1 2 1 1
}
}
// Produces:
// 1 2 3 4 5 6 7 8 9
一个简单的解决方案
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end());
这个迭代器将指向最后一个元素旁边的元素。如果不需要,您可以不使用此迭代器。
有关的进一步参考,请参阅此
编辑:
当我认为向量会被排序时,新的解决方案可能是:
vector<int> vec= {5,1,2,3,5,4,2,1,1,4,3,2,4,5,2,1,3,5,2,3,5,2,3,2,3,5,2,1,3};
set<int> s;
vector<int>::iterator vecIter=vec.begin();
vector<int>::iterator vecIterCopy;
for(;vecIter!=vec.end(); vecIter++)
{
if(s.find(*vecIter)==s.end())
{
s.insert(*vecIter);
*vecIterCopy++ = *vecIter;
}
}
O(n*log(n))解决方案:
vector<string> V={"aa","bb","aa","cc","cc"};
set<string> S;
auto i=V.begin();
auto j=i;
for(; i!=V.end(); ++i) {
if(S.insert(*i).second && i!=j++)
*j = std::move(*i);
}
V.erase(j,V.end());
还用std::remove_copy_if
修改了战俘的版本。但这里没有无关的临时:
set<string> S;
V.erase(
copy_if(
make_move_iterator(V.begin()),
make_move_iterator(V.end()),
V.begin(),
[&](const string& x){ return S.insert(x).second;}
),
V.end()
);
相关文章:
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 如何使用擦除和迭代器来删除二维向量中的项目
- 擦除删除成语的性能增益从何而来
- 矢量擦除错误,无法删除不完整的类型
- 为什么擦除+删除比删除更有效
- 如何根据某些值擦除/删除类对象的向量
- 为什么擦除-删除成语不适用于反向迭代器
- C++擦除-删除类型推断失败
- 使用擦除-删除范例将元素从一个向量移动到另一个向量
- 如何使用擦除删除习语从结构向量中删除值
- 有没有办法将擦除-删除成语与其他循环条件一起使用
- 对2D或3D矢量使用擦除-删除习惯用法
- 使用类型擦除删除C++11中的void*
- 为什么标准中没有提供擦除-删除习惯用法的便利助手
- 在c++中使用擦除-删除习语时,我应该通过引用传递吗?
- 对函数使用擦除-删除习惯用法<void(>
- 如何使用擦除-删除习惯用法并在循环中增加迭代器
- 如何在排序的向量上正确应用擦除-删除习惯用法