简体   繁体   English

如何放置到 std::array 的 std::vector?

[英]How to emplace to a std::vector of std::array?

With a vector of vectors, I can do this:使用向量向量,我可以这样做:

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

However, the equivalent fails for the vector of std::array:但是,对于 std::array 的向量,等效失败:

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

What is the correct way to emplace an array inside vector?在向量中放置数组的正确方法是什么?

Edit:编辑:

Yes, you can create std::array from initializer list :是的,您可以从 初始化列表 创建 std::array :

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

works fine.工作正常。

The error:错误:

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 doesn't have any constructors, it's initialization follows aggregate initialization. std::array没有任何构造函数,它的初始化遵循聚合初始化。

You have two options, either use push_back instead of emplace_back with a brace-init-list:您有两个选择,要么使用push_back而不是emplace_back和大括号初始化列表:

voa.push_back({ 0, 0 });

Or you can use std::array 's (implicit) copy and move constructors and construct a temporary std::array :或者您可以使用std::array的(隐式)复制和移动构造函数并构造一个临时std::array

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

Ultimately both methods should generate the same machine code.最终,这两种方法都应该生成相同的机器代码。


In response to your edit:回应您的编辑:

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

is NOT the same as不一样

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

{0, 0} is a brace-init-list , which doesn't have a type. {0, 0}是一个没有类型的大括号初始化列表 This is why you can't use them as an argument to a templated function.这就是为什么您不能将它们用作模板化 function 的参数。 See this question for more details.有关更多详细信息,请参阅此问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM