关于std::views::filter延迟求值的问题:无法用[]访问视图元素
C++视图使用operator[]报错的排查与解决
问题代码
auto ResultView { std::views::iota(1,30) | std::views::take(20) | std::views::filter([](int x){ return x%2!=0; }) }; std::cout<<ResultView[2];
错误原因
报错核心不是filter的逻辑判断,而是经过std::views::filter适配后的视图不支持随机访问迭代器,因此无法用operator[]直接通过下标访问元素。
std::views::iota和std::views::take生成的视图属于随机访问范围,但filter视图会动态跳过不满足条件的元素,无法保证O(1)时间复杂度的下标访问,标准库仅为其提供向前迭代器(forward iterator),不支持随机访问特有的operator[]操作。
解决方法
方法1:转换为支持随机访问的容器
将过滤后的视图转换为std::vector这类支持随机访问的容器,即可使用下标访问:
#include <vector> #include <ranges> #include <iostream> int main() { auto ResultView = std::views::iota(1,30) | std::views::take(20) | std::views::filter([](int x){ return x%2!=0; }); std::vector<int> filtered_vec(ResultView.begin(), ResultView.end()); std::cout << filtered_vec[2]; // 输出7 return 0; }
方法2:使用std::ranges::next移动迭代器
通过迭代器移动到目标位置,再解引用获取元素:
#include <ranges> #include <iostream> int main() { auto ResultView = std::views::iota(1,30) | std::views::take(20) | std::views::filter([](int x){ return x%2!=0; }); auto target_it = std::ranges::next(ResultView.begin(), 2); std::cout << *target_it; // 输出7 return 0; }
内容的提问来源于stack exchange,提问作者rmoss3475
相关产品推荐
相关产品推荐

