使用具有多个值的 unordered_map 移动插入

Posted

技术标签:

【中文标题】使用具有多个值的 unordered_map 移动插入【英文标题】:Move insertion with unordered_map having multiple values 【发布时间】:2020-09-21 06:30:20 【问题描述】:

我尝试了以下代码来插入移动和初始化列表。后者有效,但不是移动插入。有人可以在这里帮助我找到正确的解决方案吗?

#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;


【问题讨论】:

“作品”是什么意思?你期望什么,你得到什么结果? 欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。 题外话:当你使用using namespace std;时,你不需要在你的函数之前使用std::。但最好避免using namespace std;:***.com/questions/1452721/… 【参考方案1】:

这行有几个问题:

myrecipe.insert (std::make_pair&lt;std::string,std::make_pair&lt;double,double&gt;&gt;("eggs",(1.0,6.0)));

您要插入的类型是std::pair&lt;std::string, std::pair&lt;double, double&gt;&gt;,但这不是您在此处所做的。这是使它与make_pair一起工作的方法:

myrecipe.insert(std::make_pair&lt;std::string, std::pair&lt;double, double&gt;&gt;("eggs", std::make_pair&lt;double, double&gt;(1.0, 6.0)));

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

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

Godbolt link, so you can see it work.

【讨论】:

【参考方案2】:

你需要在双打上做一对,而不是完整的插入:

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

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

【讨论】:

main.cpp:14:66: error: no matching function for call to 'std::unordered_map<:__cxx11::basic_string>, std::pair >::insert(std::pair)' myrecipe.insert(("eggs",std::make_pair(1.0,6.0)));【参考方案3】:

如果您将该行更改为myrecipe.insert ("eggs",1.0,6.0);,它应该可以正常工作

另外,std::make_pair&lt;double,double&gt; 不应作为模板参数出现,因为它不是类型而是返回对象的函数。

【讨论】:

创建了一个 initializer_list,第一个条目被视为“键”,其余条目被视为“值”,它们被“移动”到地图中

以上是关于使用具有多个值的 unordered_map 移动插入的主要内容,如果未能解决你的问题,请参考以下文章

Javascript将具有多个值的选定选项从一个列表移动到另一个列表

在具有多个值的@each 循环中获取 (value + 1)

使用 lambda 函数在 std::unordered_map 中查找最小值

获取对 unordered_map operator[] 返回值的引用

带有 std::any 值的 unordered_map 不能使用 any_cast 字符串

强制转换为布尔值是检查是不是存在与键匹配的 unordered_map 值的有效方法吗? C++