如何使用set_union()直接扫描输出而无需存储结果?
问题解决:直接输出ranges::set_union结果无需存储
你的代码编译失败的核心原因是:ranges::set_union的第三个参数要求是输出迭代器,而你传入的lambda函数不属于迭代器类型,不符合函数模板的参数约束。
下面提供两种无需存储结果、直接输出的可行方案:
方案一:利用视图结合ranges::for_each输出
ranges::set_union返回的是一个视图(view),不会存储元素,仅在遍历时实时计算。我们可以直接遍历这个视图完成输出:
#include <vector> #include <algorithm> #include <stdio.h> #include <ranges> // 必须包含该头文件启用范围视图 using namespace std; int main() { vector<int> a = {1,2,3}, b={4,5,6}; auto union_view = ranges::set_union(a, b); ranges::for_each(union_view, [](int i){printf("%d,",i);}); }
方案二:使用ostream_iterator作为输出迭代器
ostream_iterator是标准库提供的输出迭代器,可以直接将元素输出到流中,无需额外存储容器:
#include <vector> #include <algorithm> #include <iterator> // 必须包含该头文件使用ostream_iterator #include <iostream> using namespace std; int main() { vector<int> a = {1,2,3}, b={4,5,6}; ranges::set_union(a, b, ostream_iterator<int>(cout, ",")); }
编译注意事项
g12.1.0支持C20,但编译时需要显式指定标准版本:
g++ -std=c++20 your_code.cpp -o your_program
内容的提问来源于stack exchange,提问作者Ludovic Aubert
相关产品推荐
相关产品推荐

