Range-v3中如何单独访问group_by函数返回的嵌套range内的元素
range-v3 group_by 嵌套范围元素访问方案
错误写法的核心原因
ranges::views::group_by返回的是两层嵌套的输入范围(input range):
- 外层范围的每个元素是单个分组的子范围,不支持随机访问,所以
p[0]、p.at(0)这类下标访问操作本身不合法 - 子范围本身也是range,不是map的键值对结构,直接访问
.first/.second必然报错 - 迭代器访问语法错误,成员访问前需要先解引用迭代器或调用对应方法
正确访问方式
访问第一个分组的第一个元素
需要逐层获取迭代器并解引用:
// 取外层第一个分组的迭代器,解引用得到分组子范围 auto first_group = *ranges::begin(p); // 取分组子范围的第一个元素,解引用得到map的pair结构 auto first_elem = *ranges::begin(first_group); // time_point需要用date库格式化输出 std::cout << date::format("%F %T", first_elem.first) << " = " << first_elem.second;
如果要访问第N个分组,可以用ranges::next跳转迭代器(注意输入范围是单次遍历的,迭代器移动后无法回溯):
// 访问第2个分组(下标从0开始) auto second_group = *ranges::next(ranges::begin(p), 1);
遍历所有嵌套元素
用范围for循环逐层遍历即可:
for (auto&& group : p) { std::cout << "当前分组元素:\n"; for (auto&& [time_point, value] : group) { std::cout << date::format("%F %T", time_point) << " = " << value << '\n'; } }
转为支持随机访问的结构
如果需要频繁随机访问分组,可以先把外层范围转为std::vector:
// 把所有分组转为vector存储,每个元素是对应分组的子范围 auto groups = p | ranges::to<std::vector>(); // 现在可以用下标访问分组了 auto first_group = groups[0]; auto first_elem = *ranges::begin(first_group);
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

