c++ - 如何删除 vector 中与另一个 vector 中的某些元素匹配的元素

标签 c++ c++11 visual-c++ c++14

我想删除 vector v2 中与另一个 vector v1 中的元素匹配的元素,其中 v1 中的每个元素都有对应的v2 中的元素,但反之则不然。

我的想法是像这样使用 std::vector::erasestd::remove_ifstd::find:

std::vector<int> v1{ 6, 2, 4 };
std::vector<int> v2{ 8, 2, 9, 4, 5, 3, 7, 1, 6 };

v2.erase(
  std::remove_if(v2.begin(), v2.end()
  , [&v1](auto& item)
  {
    return std::find(v1.begin(), v1.end(), item) != v1.end();
  })
);

哪个有效。但是,我想知道我是否可以不匹配已经匹配的那些,因为从 v1 -> v2 开始时这是 1:1 的关系。 v1之后会被吹走,所以可以修改。

最佳答案

排序 v1。使用 std equal range 在其中查找元素。将其与您的删除-删除习语代码一起使用(带有错误修复)。

这是 O((M+N)lg N)

std::sort( v1.begin(), v1.end() );
auto removed=std::remove_if(
  v2.begin(), v2.end(), 
  [&v1](auto& item)
  {
    auto r= std::equal_range(v1.begin(), v1.end(), item);
    return r.first!=r.second;
  }
);
v2.erase(removed, v2.end());

请注意,您在删除调用中忘记了 .end,这是执行删除删除时常见的严重错误。

如果您有合理数量的条目,编辑源 vector 以消除元素是不值得的,除非非常奇特的数据结构。

关于c++ - 如何删除 vector 中与另一个 vector 中的某些元素匹配的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47700158/

相关文章:

时间:2019-03-09 标签:c++directxmulititextures

c++ - 我的文件依赖性有什么问题?

C++ 预处理器标准行为

c++ - 抑制非平凡无用的警告 "control may reach end of non-void function"

c++ - 将 std::tr1::shared_ptr 与 std::function/std::bind 混合会导致较新的 gcc 出现编译器错误

c++ - 将 C 字符串和 vector 发送到 MurmurHash 会产生不一致的结果

c++ - 类模板别名在生成的符号中不应该是可见的,是吗?

c++ - lambda 函数/表达式是否支持 constexpr?

c++ - 如何使用WinApi获取客户端窗口位置?

c++ - 自定义 vector 类 C++