无法在向量向量上使用 emplace_back() 花括号初始化器

2024-04-25

这与我之前提出的有关使用的问题有些相关emplace_back在对向量上。将一对插入到 std::vector 时 emplace_back() 与 Push_back https://stackoverflow.com/questions/53900865/emplace-back-vs-push-back-when-inserting-a-pair-into-stdvector

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

这是我质疑的带有注释的代码

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在向量的向量上,但这似乎没有提供任何优势push_back。我对这个问题的理解正确吗?

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


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

构造两个向量。中的空向量matrix,以及过去的临时。临时值被移动到空向量中。所以这真的没那么糟糕。

然而,这:

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

使用接受初始值设定项列表的构造函数仅构造一个向量。请注意,没有“额外”initializer_list此处创建的对象。当使用花括号初始化创建任何向量时,无论如何都会创建这样的对象:

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

这也创建了一个initializer_list对象,因为这就是向量构造函数所采用的。

至于为什么emplace_back(2,3)有效,那是因为有一个向量构造函数需要一个大小和一个值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在向量向量上使用 emplace_back() 花括号初始化器 的相关文章

随机推荐