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

问题描述 投票:0回答:4

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

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};
...

有没有一种更简洁的初始化方法,例如沿着这些思路(非法):

const std::array<int, 16> a{std::views::iota(0, 16)};
const std::array<int, 16> b{std::views::iota(16, 32)};
...
c++ initializer-list iota
4个回答
1
投票

您可以使用 lambda 来初始化

std::array
iota_view
:

template<class T, size_t begin, size_t end>
constexpr std::array iota_arr = [] {
  constexpr auto iota = std::views::iota(begin, end);
  std::array<T, iota.size()> arr;
  std::ranges::copy(iota, arr.begin());
  return arr;
}();

constexpr auto a = iota_arr<int, 0, 16>;
constexpr auto b = iota_arr<int, 16, 32>;

1
投票

使用

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>());
}

1
投票

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

是的,有。您可以编写一个助手

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>();
}

演示


1
投票

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

#include <array>
#include <numeric>

template<typename T, 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);

}
© www.soinside.com 2019 - 2024. All rights reserved.