初始化 std::array 的 std::array
Posted
技术标签:
【中文标题】初始化 std::array 的 std::array【英文标题】:Initialize std::array of std::array 【发布时间】:2018-05-22 16:31:29 【问题描述】:我有和std::array
的std::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<std::array<int,3>,3> x
将把它们都变成0
,如果你同意的话。
foo
知道它应该将元素初始化为什么吗?这应该委托给调用者吗?你有点暗示你知道价值观应该是什么,但实际上并没有说出来。
@NathanOliver,@Useless 你们都是正确的。我知道所有元素都应该初始化为0
以外的某个值。我会换个问题。
你在处理什么样的价值观?
@Holt 内部数组由数值组成(可以是int
、bool
、double
,...)。这里没有技巧;)
【参考方案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<int, 10> x 不是零初始化但 std::array<int, 10> x = std::array<int, 10>() 似乎是