寻找连续整数列表初始化的快捷方式

Pau*_*zak 6 c++ initializer-list iota

我有一堆较长的手动初始化数组,例如:

const std::array<int, 16> a{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
const std::array<int, 16> b{16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
...
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以进行更简洁的初始化,例如沿着这些线(非法):

const std::array<int, 16> a{std::views::iota(0, 16)};
const std::array<int, 16> b{std::views::iota(16, 32)};
...
Run Code Online (Sandbox Code Playgroud)

小智 8

您可以使用普通的旧 iota 来完成此操作。就像这样,

#include <array>
#include <numeric>

template<typename T, std::size_t N>
constexpr auto make_range_array(T const & start) noexcept {
    std::array<T, N> range;
    std::iota(range.begin(), range.end(), start);
    return range;
}

auto main() -> int
{
    auto const a = make_range_array<int, 16>(0);
    auto const b = make_range_array<int, 16>(16);

}
Run Code Online (Sandbox Code Playgroud)

  • 在 C++ 中,“size_t”位于“std”命名空间中。 (4认同)
  • 我们不应该假设每个人都有相同的神奇脚本,可以自动将 `size_t` 更改为 `std::size_t`。通常,Stack Overflow 上的答案应该服务于更广泛的社区,而不仅仅是你的同事。我认为@Evg有一个有效的观点,因为即使答案中存在很小的错误,这些错误仍然应该被修复(由你或其他人),以免误导没有经验的读者,他们可能会产生错误的印象,认为错误是存在的他们这边。 (3认同)

Jar*_*d42 5

使用std::index_sequence,您可能会执行以下操作:

template <std::size_t N>
constexpr std::array<int, N> make_iota_array(int start = 0)
{
    return [&]<std::size_t... Is>(std::index_sequence<Is...>){
        return std::array<int, N>{static_cast<int>(start + N)...};
    }(std::make_index_sequence<N>());
}
Run Code Online (Sandbox Code Playgroud)

  • 这受到可用模板参数总数的限制。对于某些实现,该值小至 256(标准要求的最低界限)。 (2认同)

use*_*570 2

有没有一种更简洁的初始化方法

就在这里。您可以编写一个助手,make_array如下所示。

#include <iostream>
#include <type_traits>
#include <array>

template<std::size_t start, std::size_t end>
std::enable_if_t<(end > start), std::array<int, end - start>> constexpr make_array()
{
    std::array<int, end - start> tempArray{};
    std::size_t count = 0;
    for(int &elem:tempArray)
    {
        elem = start + count;
        count++;
    }
    return tempArray;
}

int main()
{
    constexpr auto arr = make_array<16, 32>();
}
Run Code Online (Sandbox Code Playgroud)

演示