gpt4 book ai didi

c++ - emplace_back 不适用于 std::vector>

转载 作者:IT老高 更新时间:2023-10-28 12:58:04 37 4
gpt4 key购买 nike

我正在尝试做 emplace_back变成 std::vector<std::map<int, int>> ,但找不到正确的语法。

#include<map>
#include<vector>

int main()
{
std::vector<std::map<int, int>> v;
std::map<int,int> a {{1,2}};

v.push_back({{1,2}});

v.emplace_back({1,2}); // error
v.emplace_back({{1,2}}); // error
v.emplace_back(({1,2})); // error
}

push_back在这里工作,但不是 emplace_back .我怎样才能得到 emplace_back工作吗?

最佳答案

emplace_back确实将所有参数转发给成员类型的匹配构造函数。现在,std::map有一个初始化列表构造函数,但它需要一个列表 std::pair<const Key, Value> ,即 std::pair<const int, int> . push_back不是模板,所以它只需要一种类型,从而就地执行转换。也就是说,这里没有进行类型推导。

您需要明确声明您想要 std::pair ;以下应该有效:

#include<map>
#include<vector>

int main()
{
std::vector<std::map<int, int>> v;

v.emplace_back(std::initializer_list<std::pair<const int, int>>{
{1,2},{3,4},{5,6}});

return 0;
}

出于同样的原因,这不会编译:

    v.emplace_back({std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)});

这是因为,虽然大括号括起来的列表可能会产生一个初始化列表,但它不是必须的。它也可以是构造函数调用或类似的东西。所以,写

auto l = {std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)};

产生 l 的初始化列表,但表达式本身可能会以另一种方式使用:

std::pair<std::pair<const int, int>, std::pair<const int, int>> p =
{std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)}

整个事情变得有点困惑。

基本上,如果你有一个大括号封闭列表,它可能会产生一个初始化列表或调用一个匹配的构造函数。在某些情况下,编译器无法确定需要哪些类型; emplace_back是其中之一(因为转发)。在其他情况下,它确实有效,因为所有类型都在表达式中定义。例如:

#include <vector>
#include <utility>

int main()
{
std::vector<std::pair<const int, int>> v =
{{1,2},{3,4},{5,6}};
return 0;
}

现在它不起作用的原因是无法推断出任何类型。 IE。 emplace_back尝试推断输入类型的名称,但这是不可能的,因为大括号封闭列表有几种可以描述的类型。因此没有匹配的函数调用。

关于c++ - emplace_back 不适用于 std::vector<std::map<int, int>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33207232/

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