初始化 std::array 的 std::array

Posted

技术标签:

【中文标题】初始化 std::array 的 std::array【英文标题】:Initialize std::array of std::array 【发布时间】:2018-05-22 16:31:29 【问题描述】:

我有和std::arraystd::array,并说我想将所有数组初始化为1,2,3。我们写:

std::array<std::array<int,3>,3> x1,2,3,1,2,3,1,2,3;

这不是很方便。当你有超过 3 个数组,或者每个数组有超过 3 个元素时,它会变得非常混乱。

但是,如果数组的大小未知先验,情况会变得更糟:

template <size_t n, size_t T> struct foo
  std::array<std::array<int,n>,T> x;

如何初始化x?为了更清楚,我想将x 中的所有数组初始化为给定某个参数的数组。也就是说,类似于:

template <size_t n, size_t T> struct foo
  static constexpr int N20;

  std::array<std::array<int,n>,T> x;

  foo() : x N,N,..., N,N,..., ... 

(如果可能的话)。有什么建议或想法吗?我总是可以遍历x 并调用方法fill,如下面的代码:

for (size_t idx = 0; idx < x[0].size(); idx++)
  x[idx].fill(N);

但这不是初始化,对吧?我是使用std::array 的新手,我不知道我是否在这里问一些假的东西:/

【问题讨论】:

您真的需要将所有元素初始化为特定值吗? std::array&lt;std::array&lt;int,3&gt;,3&gt; x 将把它们都变成0,如果你同意的话。 foo 知道它应该将元素初始化为什么吗?这应该委托给调用者吗?你有点暗示你知道价值观应该是什么,但实际上并没有说出来。 @NathanOliver,@Useless 你们都是正确的。我知道所有元素都应该初始化为0以外的某个值。我会换个问题。 你在处理什么样的价值观? @Holt 内部数组由数值组成(可以是intbooldouble,...)。这里没有技巧;) 【参考方案1】:

使用std::index_sequence,您可能会执行以下操作:

template <std::size_t ... Is, typename T>
constexpr std::array<T, sizeof...(Is)>
make_array(const T& value, std::index_sequence<Is...>)

    return (void(Is), value)...;


template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)

    return make_array(value, std::make_index_sequence<N>());

然后:

template <size_t n, size_t T>
struct foo
    static constexpr int N20;

    std::array<std::array<int,n>,T> x;

    foo() : xmake_array<T>(make_array<n>(N)) 
;

【讨论】:

我刚刚测试了它,它太疯狂了(我的意思是非常好)。这里唯一的问题是我需要 C++14 才能使其工作。有没有办法让你的解决方案适合 C++11?不过,我非常感谢您的回答:) index_sequence 也可能在 C++11 中实现。 例如:implementation-c14-make-integer-sequence

以上是关于初始化 std::array 的 std::array的主要内容,如果未能解决你的问题,请参考以下文章

std::array 默认初始化还是值初始化?

std::array 初始化中的大括号省略

为啥 std::array<int, 10> x 不是零初始化但 std::array<int, 10> x = std::array<int, 10>() 似乎是

我应该如何大括号初始化 std::pairs 的 std::array?

std::array 的嵌套聚合初始化

如何使用初始化列表构造 std::array 对象? [复制]