我有一堆较长的手工初始化数组,例如:
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)};
...
您可以使用 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>;
使用
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>());
}
有没有更简洁的初始化方法
是的,有。您可以编写一个助手
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>();
}
您可以使用普通的 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);
}