初始化具有非零值的C样式数组,不带循环

时间:2016-04-23 12:24:32

标签: c++ arrays

我们知道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 )

有没有办法在不使用vectoralgorhtm的情况下使用非零值初始化整个数组?

也许constexpr会有所帮助?什么是最好的解决方案?

P.S:

海湾合作委员会提供this syntax

int a[5] = {[0..4] = 33};

但我不确定它是否对其他编译器有效。

2 个答案:

答案 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