是没有
std::array<T,size>::array(const T& value);
疏忽大意?对我来说似乎很有用,动态容器(如std::vector
)确实具有类似的构造函数。
我完全知道
std::array<T,size>::fill(const T& value);
但这不是构造函数,并且内存将首先清零。如果我要所有人都-1
像这个家伙怎么办?
是没有
std::array<T,size>::array(const T& value);
疏忽大意?对我来说似乎很有用,动态容器(如std::vector
)确实具有类似的构造函数。
我完全知道
std::array<T,size>::fill(const T& value);
但这不是构造函数,并且内存将首先清零。如果我要所有人都-1
像这个家伙怎么办?
std::vector
)。因此,由于它始终等同于array(); array.fill();
,因此首先省略构造函数并不会掩盖这一事实。
Answers:
std::array
根据设计,是一个聚合,因此没有用户声明的构造函数。
如您所说,可以fill
在默认构造后使用。由于它是一个聚合,因此默认构造不会将内存归零,但会将其保留为未初始化(如果所包含的类型是可初始化的)。
:/
请注意,您可以利用数组未初始化为零且具有复制构造函数do的事实来有效地模拟这种构造函数。
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');
;-)
。
char
可以推断出来,所以您可以只写make_array<20>('z')
而不是make_array<20,char>('z')
make_array
替代品:-)
T
无法默认构造时,这是行不通的,那是您非常需要fill构造函数的时候。
您可以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>());
}
std::make_index_sequence
是C ++ 14,但可以在C ++ 11中实现。
static_cast<void>(Is)
是柄邪operator,
那T
可能会提供。
T
默认情况下不可构造时(即其他答案不足)时,也可以使用。
std::index_sequence
可以用对数实例化而不是线性来实现。并且编译器可能只具有“本征”来执行一个实例化。然后,不再有递归。
std::vector
,reserve
整个大小并emplace_back
循环访问。对于一百万个元素,由于实际内存有限,堆栈会出现问题。