我们知道C ++允许initialization of C-style arrays with zeros:
int a[5] = {0};
// or
int a[5] = {};
同样适用于std :: array
std::array a<int, 5> = {};
然而,这不起作用:
int a[5] = {33}; // in memory( 33, 0, 0, 0, 0 )
std::array<int, 5> = {33}; // in memory( 33, 0, 0, 0, 0 )
有没有办法在不使用vector
或algorhtm
的情况下使用非零值初始化整个数组?
也许constexpr
会有所帮助?什么是最好的解决方案?
P.S:
海湾合作委员会提供this syntax
int a[5] = {[0..4] = 33};
但我不确定它是否对其他编译器有效。
答案 0 :(得分:1)
我有一些代码可以使用模板元编程实现std::array
的编译时初始化(当然)。
namespace impl {
template <class SeqTy, size_t N, SeqTy FillVal, SeqTy... Seq>
struct make_fill {
using type = typename make_fill<SeqTy, N-1, FillVal, FillVal, Seq...>::type;
};
template <class SeqTy, SeqTy FillVal, SeqTy... Seq>
struct make_fill<SeqTy, 0, FillVal, Seq...> {
using type = std::integer_sequence<SeqTy, Seq...>;
};
template <class T>
struct make_array;
template <class SeqTy, SeqTy... Seq>
struct make_array<std::integer_sequence<SeqTy, Seq...>> {
static constexpr std::array<SeqTy, sizeof...(Seq)> value() {
return std::array<SeqTy, sizeof...(Seq)>{ {Seq...} };
}
};
} // end impl namespace
template <class SeqTy, size_t N, SeqTy FillVal = 0ul>
constexpr std::array<SeqTy, N> fill() {
return impl::make_array<typename impl::make_fill<SeqTy, N, FillVal>::type>::value();
};
您可以使用如下:
std::array<size_t, N> ones = fill<size_t,N,1ul>();
如果您不想使用std::array
答案 1 :(得分:1)
你对<algorithm>
有什么看法?我认为这很干净:
int a[5]; // not initialized here yet
std::fill(std::begin(a), std::end(a), 33); // everything initialized to 33