如何加入范围范围?
Posted
技术标签:
【中文标题】如何加入范围范围?【英文标题】:How to join range of ranges? 【发布时间】:2021-09-13 21:09:12 【问题描述】:auto points() const
auto ranges = children() | std::views::transform([](auto child) return child->points(); );
return std::views::join(ranges);
不能使用积分
for(auto& pt: points())
错误没有运算符 "!=" 匹配这些操作数
【问题讨论】:
【参考方案1】:一切都取决于 children()
和 child::points()
究竟返回什么。
如果children()
按值返回一个容器,那么您正在创建一个悬空的适配器(通过|
的管道)——它的迭代器不能被取消引用。
此外,child::points()
必须返回 view
。退回容器将不起作用。
这是一个工作示例:
#include <iostream>
#include <vector>
#include <ranges>
struct child
std::vector<int> points_1, 2, 3;
const auto& points() const
return points_;
;
struct element
std::vector<child> children_, ;
const auto& children() const
return children_;
auto points() const
auto ranges = children() | std::views::transform([](auto& child)
return std::views::all(child.points());
);
return std::views::join(ranges);
;
int main()
auto e = element();
for (auto x : e.points())
std::cout << x << ' ';
注意访问器(child::points()
和 element::children()
)如何通过 const&
返回。
【讨论】:
join() 完美。它可以加入范围范围以上是关于如何加入范围范围?的主要内容,如果未能解决你的问题,请参考以下文章