为什么 std::filter_view 没有办法急切地评估它并将其转换为以 const 开头的视图?
Why does std::filter_view not have a way to eagerly evaluate it and convert it to view whose begin in const?
filter_view
有一个常量开头。
但我想知道为什么它上面没有成员或自由函数 return some_filter_view 类型与 filter_view 相同,只是它有一个 const begin ().显然这个方法是 O(n),但它会很好,因为它在代码中是显式的。
仅仅是标准化工作量太大/编译速度过慢,还是有其他原因?
我想要的基本示例:
void fn(){
std::array<int,5> arr{1,2,3,4,5};
const auto filtered = arr | std::views::filter([](auto){return true;});
filtered.begin(); // does not compile
// --would be nice if we could do
// const auto filtered = arr | std::views::filter([](auto){return true;}) | eval_begin;
// --now filtered.begin() can be called
}
这基本上是“为什么我们不能 filter_view
在构建时缓存”。
答案是它会复制 O(N) 因为缓存的迭代器是原始视图的迭代器,所以你复制的视图必须再次找到 begin()
来获得它的副本。
如果您已经有一个(非 const)filter_view
,那么用 subrange
从中创建一个 const-iterable 视图就很简单了。很明显,这需要 filter_view
在 subrange
保持活动状态时保持活动状态。
filter_view
但我想知道为什么它上面没有成员或自由函数 return some_filter_view 类型与 filter_view 相同,只是它有一个 const begin ().显然这个方法是 O(n),但它会很好,因为它在代码中是显式的。
仅仅是标准化工作量太大/编译速度过慢,还是有其他原因?
我想要的基本示例:
void fn(){
std::array<int,5> arr{1,2,3,4,5};
const auto filtered = arr | std::views::filter([](auto){return true;});
filtered.begin(); // does not compile
// --would be nice if we could do
// const auto filtered = arr | std::views::filter([](auto){return true;}) | eval_begin;
// --now filtered.begin() can be called
}
这基本上是“为什么我们不能 filter_view
在构建时缓存”。
答案是它会复制 O(N) 因为缓存的迭代器是原始视图的迭代器,所以你复制的视图必须再次找到 begin()
来获得它的副本。
如果您已经有一个(非 const)filter_view
,那么用 subrange
从中创建一个 const-iterable 视图就很简单了。很明显,这需要 filter_view
在 subrange
保持活动状态时保持活动状态。