如何放置到std::数组的std::向量



有了一个向量的向量,我可以做到这一点:

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});

在向量中放置数组的正确方法是什么?

编辑:

是的,您可以从初始值设定项列表:创建std::数组

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> &'

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}大括号初始化列表,它没有类型。这就是为什么不能将它们用作模板化函数的参数。有关详细信息,请参阅此问题。

最新更新