如何加入范围范围?
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
如何加入范围的范围?
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&
.