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)
使用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)
有没有一种更简洁的初始化方法
就在这里。您可以编写一个助手,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)