gpt4 book ai didi

c++ - 不能在 vector 的 vector 上 emplace_back() 花括号初始化器

转载 作者:太空狗 更新时间:2023-10-29 21:09:57 31 4
gpt4 key购买 nike

这与我之前提出的关于使用 emplace_back 的问题有些相关在成对的 vector 上。 emplace_back() vs push_back when inserting a pair into std::vector

现在我的问题是关于使用 emplace_back在 vector 的 vector 上。

这是我要评论的代码

std::vector<std::vector<int>> matrix;

matrix.emplace_back({1,2,3}); //doesn't compile

matrix.emplace_back(1,2,3); //doesn't compile

matrix.push_back({1,2,3}); //works and does what is expected (insert a vector made of {1,2,3} into matrix);

matrix.emplace_back(std::vector<int>{1,2,3}); //works but
//defeats the purpose of using emplace_back since this makes a copy
//and is thus equivalent to push_back in this case?

matrix.emplace_back(3,2) //this compiles,
//but it seems to insert a vector of size 3 made of 2s into the matrix.
//not actually sure why it does this

所以,由此,matrix.emplace_back(std::vector<int>{1,2,3});似乎是唯一正确的使用方式 std::vector<T>::emplace_back在 vector 的 vector 上,但这似乎没有比 push_back 有任何优势.我对这个问题的理解是否正确?

此外,有人可以解释为什么 matrix.emplace_back(3,2)是在矩阵中插入一个由 2 组成的大小为 3 的 vector 吗?

最佳答案

{1, 2, 3}不能推断为 initializer_list<int>在这种情况下(这是您要使用的 vector<int> 构造函数所期望的。)所以您需要稍微帮助它:

matrix.emplace_back(initializer_list<int>{1, 2, 3});

这在使用 push_back() 时不是必需的.我不知道确切的细节,但是emplace_back()是函数模板,而 push_back()不是。模板的推导规则不同(更严格。)并且花括号初始化程序没有类型。因此,它有自己关于类型推导如何工作的特殊规则。

至于效率,这个:

matrix.emplace_back(vector<int>{1, 2, 3});

构造两个 vector 。 matrix 中的空 vector ,以及临时通过的。临时对象被移动到空 vector 中。所以其实并没有那么糟糕。

但是,这:

matrix.emplace_back(initializer_list<int>{1, 2, 3});

只构造一个 vector ,使用接受 initializer_list 的构造函数。请注意,没有“额外的” initializer_list在这里创建的对象。在使用花括号初始化创建任何 vector 时,无论如何都会创建这样一个对象:

vector<int> vec{1, 2, 3};

这也会创建一个 initializer_list对象,因为这是 vector 构造函数所采用的。

至于为什么emplace_back(2,3)有效,那是因为有一个 vector 构造函数接受一个大小和一个值。

关于c++ - 不能在 vector 的 vector 上 emplace_back() 花括号初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483606/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com