如何将std::array嵌入到std::vector中?

4

使用一个向量的向量,我可以这样做:

std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});

然而,对于 std::array 的向量,相应的等价物则失败了:
std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});

如何正确地在向量(vector)中嵌入数组?

编辑:

是的,你可以从初始化列表(initializer list)创建std :: array:

std::array<int, 2> a = {0, 0}

运行良好。

错误:

error C2664: 'std::array<int,2>::array(const std::array<int,2> &)': cannot convert argument 1 from 'std::initializer_list<int>' to 'const std::array<int,2> &'

3
数组是否在向量内并不重要?如果尝试使用初始值列表构造不在向量内的数组,会得到相同的错误吗?请在问题中包含错误信息。 - 463035818_is_not_a_number
1
请参考以下链接:https://dev59.com/a2w15IYBdhLWcg3wA24A - Daniel Langr
1
std::array 没有用于转发的 emplace_back 构造函数。 - sweenish
我认为在这里你可以找到为什么它不起作用的原因:https://dev59.com/h2sy5IYBdhLWcg3w-i7h - Arritmic
1个回答

13

std::array没有任何构造函数,它的初始化遵循聚合初始化规则。

你有两个选择,要么使用push_back而不是emplace_back和花括号初始化列表一起使用:

voa.push_back({ 0, 0 });

或者您可以使用 std :: array 的(隐式)复制和移动构造函数,并构建临时的 std :: array

voa.emplace_back(std::array<int>{0, 0}); // pre C++17
voa.emplace_back(std::array{0, 0});      // C++17

最终这两种方法应该生成相同的机器码。


针对您的编辑:

std::array<int, 2> a = {0, 0};

不等同于

std::array<int, 2> a = std::initializer_list<int>{0, 0};

{0, 0} 是一个 大括号初始化列表,它没有类型。这就是为什么你不能将它们用作模板函数的参数。有关更多详细信息,请参见此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接