如何从std::chunk_by的返回值中获取指定单个块?
获取
chunk_by视图的指定元素 你的问题核心在于:std::views::chunk_by返回的是输入范围(input range),这类范围的迭代器仅支持单向递增操作,不支持随机访问——这就是为什么operator[]、at()和begin()+1都会编译失败的原因。
正确实现方式
最直接高效的方法是使用std::ranges::next,它可以安全地将迭代器移动指定步数(对于输入迭代器,会执行对应次数的递增操作),然后解引用得到目标元素:
#include <iostream> #include <ranges> #include <vector> #include <iterator> // 包含std::ranges::next auto main() -> int { using std::cout; std::vector<int> v{1,2,2,2,1,1,1,2,1}; auto chunks = v | std::views::chunk_by(std::equal_to{}); // 获取第二个chunk(索引从0开始,所以步数是1) auto second_chunk_it = std::ranges::next(chunks.begin(), 1); const auto& second_chunk = *second_chunk_it; // 输出验证 cout << "第二个chunk:["; for (const auto& value : second_chunk) { cout << value << ", "; } cout << "]\n"; cout << std::flush; return 0; }
补充说明
- 如果你需要的是一个包含该元素的视图(而非直接获取元素),你提到的
| std::views::drop(1) | std::views::take(1)是可行的,但std::ranges::next更适合直接获取单个元素的场景。 - 注意:由于
chunk_by返回的是输入范围,每次遍历(包括std::ranges::next的递增操作)都会消耗迭代器,因此如果需要多次访问不同位置的元素,最好先将视图转换为容器(比如std::vector),避免重复遍历原序列:auto chunks_vec = std::vector(chunks.begin(), chunks.end()); auto& second_chunk = chunks_vec[1]; // 此时可以用operator[]
内容的提问来源于stack exchange,提问作者FalcoGer
相关产品推荐
相关产品推荐

