【发布时间】:2021-02-14 08:01:59
【问题描述】:
我想将view::filter 应用于一个向量,以便找到它与另一个向量的 set_intersection(或 set_difference 等)。
我对这样做的兴趣在于它允许您更改原始容器的特定子集(并且还可以节省 std::set_intersection 附带的一些复制)。
这或多或少是我想做的:
#include <iostream>
#include <vector>
#include <ranges>
int main() {
std::vector<int> set1 = { 1, 2, 3, 4, 5, 6 },
set2 = { 4, 5, 6, 7, 8, 9 };
auto intersection = set1 | std::views::filter([&set2](int n)
{ return std::find(set2.cbegin(), set2.cend(), n) != set2.cend(); });
for (int& v : intersection)
v *= 2;
for (auto v : set1)
std::cout << v << " "; // prints 1 2 3 8 10 12
}
但是,这段代码看起来效率很低,因为它会多次迭代 set2。使用ranges 库是否有更好的方法来实现这一点?
【问题讨论】:
-
您可能希望从
set2构造一个unordered_set并将其捕获到您的过滤器 lambda 中。 -
你知道两个向量都会被排序,如图所示吗?
标签: c++ performance time-complexity c++20 std-ranges