You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找用连续整数初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:48:31