使用具有多个值的无序映射移动插入



我尝试了下面的代码来插入move和initializer列表。后者有效,但移动插入无效。有人能帮我找到正确的解决方案吗?

#include <iostream>
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main ()
{
std::unordered_map<std::string,std::pair<double, double>>
myrecipe;
myrecipe.insert (std::make_pair<std::string,std::make_pair<double,double>>("eggs",(1.0,6.0)));
myrecipe.insert ( {{"sugar",{0.8, 1.0}},{"salt",{0.1, 2.0}}} );   
std::cout << "myrecipe contains:" << std::endl;
for (auto& x: myrecipe)
std::cout << x.first << ": " << x.second.first << ":" << x.second.second << std::endl;
std::cout << std::endl;
return 0;
}

此行有几个问题:

myrecipe.insert (std::make_pair<std::string,std::make_pair<double,double>>("eggs",(1.0,6.0)));

您要插入的类型是std::pair<std::string, std::pair<double, double>>,但这不是您在这里所做的。以下是如何使其与make_pair:一起工作

myrecipe.insert(std::make_pair<std::string, std::pair<double, double>>("eggs", std::make_pair<double, double>(1.0, 6.0)));

或者以更可读的格式,依赖于模板参数类型推导:

myrecipe.insert(std::make_pair("butter", std::make_pair(2.0, 3.0)));

Godbolt链接,所以你可以看到它的工作。

您需要在双打上进行配对,而不是完整的插入:

myrecipe.insert(("eggs",std::make_pair<double,double>(1.0,6.0)));

澄清一下:
<std::string,std::pair<double, double>>不是std::pair,它是一个键值对(原文如此!(
您的std::pair<double, double>是一个";真实的";std::pair(或者有人可以说是2元组(,它可以在C++中用作std::pair。因此,您需要std::make_pair_call

如果将该行更改为myrecipe.insert ({"eggs",{1.0,6.0}});,则应按预期工作

此外,std::make_pair<double,double>不应作为模板参数出现,因为它不是类型,而是返回对象的函数。

最新更新