如何结合ranges::views::enumerate与views::filter?过滤函数类型疑问
问题解决:enumerate+filter的过滤函数类型
首先,ranges::views::enumerate会把原容器的每个元素转换成pair结构,其中第一个成员是元素的索引(类型为std::size_t),第二个成员是原容器元素的引用(若原容器是const类型,则为const引用)。
你的过滤函数(比如lambda)参数用const auto&完全可行,也可以显式指定类型——比如针对std::vector<T>容器,参数类型可以是const std::pair<std::size_t, T&>&(或const std::pair<std::size_t, const T&>&,取决于容器是否为const)。
你的代码写法本身没问题,报错大概率是以下原因导致:
- 缺少range-v3必要头文件:确保包含
#include <range/v3/view/enumerate.hpp> #include <range/v3/view/filter.hpp> - 编译标准不兼容:range-v3需要C++17及以上版本,编译时需添加
-std=c++17(或更高版本)参数 - range-v3版本差异:旧版本中
enumerate属于ranges::view命名空间而非ranges::views,可尝试把ranges::views::enumerate改为ranges::view::enumerate
修正后的示例代码:
#include <range/v3/view/enumerate.hpp> #include <range/v3/view/filter.hpp> // 假设level.items是std::vector或其他可遍历容器 // 过滤示例:保留索引为偶数的元素 auto f = [](const auto& enumerate_pair) { // enumerate_pair.first是索引,enumerate_pair.second是原容器元素 return enumerate_pair.first % 2 == 0; }; auto items_to_remove = level.items | ranges::views::enumerate | ranges::views::filter(f);
若仍报错,检查range-v3版本是否正确,或编译选项是否开启了C++17及以上标准。
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

