C++20:如何按大小分割范围?

gav*_*n.d 4 c++ range c++20 std-ranges

我想将范围拆分{1, 2, 3, 4, 5}为 <任何大小>的子范围范围(例如,大小为 2: {{1, 2}, {3, 4}, {5}})。但std::views::split只能按分隔符拆分。

是否没有标准的“反向连接”或其他方法可以做到这一点?

Bar*_*rry 5

range-v3 调用此算法chunk。C++20 中没有这样的范围适配器,但它是为C++23提议的同名集合的一部分。例如

#include <vector>
#include <range/v3/view/chunk.hpp>
#include <fmt/format.h>
#include <fmt/ranges.h>

int main() {
    std::vector v = {1, 2, 3, 4, 5};
    fmt::print("{}\n", v | ranges::views::chunk(2)); // prints {{1, 2}, {3, 4}, {5}}
}
Run Code Online (Sandbox Code Playgroud)

对于跨语言的算法,这似乎是一个非常一致的名称选择。Python有分块,Rust 有分,Swift 有chunks(ofCount: n),D有分块,等等。