【发布时间】:2017-12-07 17:02:35
【问题描述】:
我想删除向量v2 中与另一个向量v1 中的元素匹配的元素,其中v1 中的每个元素在v2 中都有对应的元素,但反之则不然。
我的想法是像这样使用std::vector::erase、std::remove_if 和std::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之后会被吹走,所以可以修改。
【问题讨论】:
-
你能先对向量进行排序吗?
-
@UKMonkey,而不是
v2。你可以对v1做任何事情。v2不一定是排序的。 -
如果 v1 不是特别大,您应该将其转换为 std::unordered_set,利用 0(1) 复杂度。
标签: c++ c++11 visual-c++ c++14