如何加入范围范围?

How to join range of ranges?

如何加入范围的范围?

auto points() const
    {
        auto ranges = children() | std::views::transform([](auto child) { return child->points(); });
        return std::views::join(ranges);
    }

不能在

使用积分
for(auto& pt: points())

错误没有运算符“!=”匹配这些操作数

一切都取决于 children()child::points() return。

如果 children() return 是一个按值计算的容器,那么您正在创建一个 悬挂 的适配器(通过带有 | 的管道) - 它的迭代器不能被取消引用。

此外,child::points()必须return一个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&.

return