寻找用连续整数初始化std::array的简便方法
简洁初始化std::array的方法
你手动逐个列举元素初始化长std::array的方式确实繁琐,想用std::views::iota简化初始化的思路完全合理,但当前写法非法——因为std::array是聚合类型,它的构造不支持直接接收范围视图作为初始化参数。下面提供几种可行的简洁方案:
方案1:自定义辅助函数(C++20及以上)
写一个通用的模板函数,借助范围拷贝完成初始化,并且支持编译期计算:
#include <array> #include <ranges> #include <algorithm> template<typename T, std::size_t N> constexpr std::array<T, N> make_array_from_range(auto&& range) { std::array<T, N> arr{}; std::ranges::copy(range, arr.begin()); return arr; }
使用方式非常直观:
constexpr auto a = make_array_from_range<int, 16>(std::views::iota(0, 16)); constexpr auto b = make_array_from_range<int, 16>(std::views::iota(16, 32));
这个函数是constexpr的,初始化过程可以在编译期完成,完全符合你对const数组的要求,后续其他同类型数组也能复用。
方案2:直接用std::to_array(C++23及以上)
C++23标准给std::to_array新增了范围构造支持,不用自己写辅助函数就能直接用视图初始化:
#include <array> #include <ranges> constexpr auto a = std::to_array<int, 16>(std::views::iota(0, 16)); constexpr auto b = std::to_array<int, 16>(std::views::iota(16, 32));
这是最简洁的方式,但需要你的编译器支持C++23标准(比如GCC 12+、Clang 15+)。
方案3:编译期循环生成(C++17及以上)
如果你的项目还在使用C++17,可以用constexpr循环手动填充数组,兼容性更好:
#include <array> template<typename T, std::size_t N> constexpr std::array<T, N> generate_iota(T start) { std::array<T, N> arr{}; for (std::size_t i = 0; i < N; ++i) { arr[i] = start + static_cast<T>(i); } return arr; }
使用时只需指定起始值:
constexpr auto a = generate_iota<int, 16>(0); constexpr auto b = generate_iota<int, 16>(16);
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

