为什么std :: array没有一个构造函数来为数组填充一个值?

时间:2013-07-29 12:11:32

标签: c++ c++11 stdarray

是否缺席

std::array<T,size>::array(const T& value);
监督?它对我来说似乎很有用,而动态容器(如std::vector)确实有类似的构造函数。

我完全了解

std::array<T,size>::fill(const T& value);

但这不是构造函数,内存将首先归零。如果我希望所有-1都像this guy那样怎么办?

4 个答案:

答案 0 :(得分:49)

std::array在设计上是一个聚合,因此没有用户声明的构造函数。

正如您所说,您可以在默认构建后使用fill。由于它是一个聚合,因此默认构造不会将内存归零,但会使其保持未初始化状态(如果包含的类型可以简单地初始化)。

答案 1 :(得分:21)

请注意,您可以通过利用数组未初始化为零的事实来高效地模拟这种类型的构造函数,并且具有复制构造函数并且可以。

template <size_t N, class T>
array<T,N> make_array(const T &v) {
    array<T,N> ret;
    ret.fill(v);
    return ret;
}

auto a = make_array<20>('z');

答案 2 :(得分:11)

首先,它不是std::array<T>,而是std::array<T,N>,其中N是编译时常量积分表达式。​​

其次,std::array是按设计聚合的。所以它没有任何使它成为非聚合的东西,这就是为什么它没有构造函数......和析构函数,虚函数等等。

答案 3 :(得分:9)

您可以使用std::index sequence

namespace detail
{

    template <typename T, std::size_t...Is>
    constexpr std::array<T, sizeof...(Is)>
    make_array(const T& value, std::index_sequence<Is...>)
    {
        return {{(static_cast<void>(Is), value)...}};
    }
}

template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)
{
    return detail::make_array(value, std::make_index_sequence<N>());
}

Demo

std::make_index_sequence是C ++ 14,但可以在C ++ 11中实现。

static_cast<void>(Is)用于处理operator,可能提供的邪恶T