【发布时间】:2017-01-01 12:50:47
【问题描述】:
在给定另一个向量的情况下,从一个向量中删除元素的最佳方法是什么?
我想出了以下代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void remove_elements(vector<int>& vDestination, const vector<int>& vSource)
{
if(!vDestination.empty() && !vSource.empty())
{
for(auto i: vSource) {
vDestination.erase(std::remove(vDestination.begin(), vDestination.end(), i), vDestination.end());
}
}
}
int main()
{
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
vector<int> v3={1,2,3,4,5,6,7,8,9};
remove_elements(v3,v1);
remove_elements(v3,v2);
for(auto i:v3)
cout << i << endl;
return 0;
}
这里的输出将是:
7
8
9
【问题讨论】:
-
假设向量足够大以证明甚至打扰优化是合理的,我会首先将
vDestination转换为std::list(或智能指针列表?)以避免从向量中删除昂贵的(因为它必须是连续的)并在最后返回std::vector -
@slawekwin:我强烈怀疑这对于任何实际大小的矢量来说都会更快。列表需要额外的重定向并且不能有效地缓存。 (我知道元素删除对于列表来说是 O(1),对于向量来说是 O(N)。)
-
@Frank 我也不确定,但我相信测量它会是一个有趣的实验:)
-
所有向量都排序了吗?
-
如果首先创建
unordered_set(来自vSource)有助于提高效率,可能值得一试。理论上应该将最坏情况从N * M更改为N + M(假设N是vDestination大小和M是vSource大小-每个vDestination元素查找一次,而不是最多M查找+ 设置创建),但它取决于存储桶配置。另外,您没有提到重复项会发生什么 - 应该删除一次,还是全部删除?
标签: c++ algorithm c++11 vector