c – 优雅的方式去除另一个向量中包含的向量的所有元素?

在查找一些代码时,我发现std :: set_difference的循环和算法缓慢的实现
for(int i = 0; i < a.size(); i++)
 {
  iter = std::find(b.begin(),b.end(),a[i]);
  if(iter != b.end())
  {
     b.erase(iter);
  }
 }

它可以很容易地替换为排序(向量不排序)set_difference,但这需要分配新的内存(请参阅我最近的Q Can output of set difference be stored in first input?为什么它不能完成“inplace”).
所以我的解决方案将是:

sort(a.begin(),a.end());
for(size_t i = 0; i < b.size(); i++)
{
 if (binary_search(a.begin(),a.end(),b[i]))
 {
     swap(b[i],b[b.size()-1]); //remove current element by swapping with last
     b.pop_back();     // and removing new last by shrinking
 }
}

可以做得更优雅吗?
优雅是主观的,所以在这个Q的范围内,Q被定义为更清晰的代码(理想的是STL算法的东西,但是我认为它不能完成),但没有内存分配,并且alg复杂度没有增加.

解决方法

假设这两个数组都被排序,这个在O(N M)中进行.
auto ib = std::begin(two);
  auto iter = std::remove_if (
       std::begin(one),std::end(one),[&ib](int x) -> bool {
                       while  (ib != std::end(two) && *ib < x) ++ib;
                       return (ib != std::end(two) && *ib == x);
                     });

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...