将 unordered_map 分配给一对对象

Posted

技术标签:

【中文标题】将 unordered_map 分配给一对对象【英文标题】:Assigning of unordered_map to pair of objects 【发布时间】:2020-03-20 01:59:31 【问题描述】:

我试图理解unordered_map 的分配,我收到以下错误:没有匹配函数调用std::pair<foo, foo>::pair(),根据unordered_map operator[] 的文档:

如果 k 不匹配容器中任何元素的键,该函数将插入一个具有该键的新元素并返回对其映射值的引用。

所以我试图将一个对象(来自make_pair)分配给这个引用,我猜这是不允许的。但是使用pair<int,int>,它可以工作,然后我想知道我是否必须为foo 声明一些其他运算符才能使其工作。

#include <bits/stdc++.h>
using namespace std;

struct foo 
  int n;
  foo(int n): n(n) ;
;

int main()
  unordered_map<int, pair<foo,foo>> m;
  //m[3] = make_pair(foo(1),foo(2));         <--- error here

  unordered_map<int, pair<int,int>> ii;
  ii[3] = make_pair(1,2);

【问题讨论】:

您是否阅读并尝试理解错误信息? -bitmask,是的,我已经盯着它看了一段时间,我会在这里发布(很长),如果有人可以帮助我破译它,那就太好了。 好吧,如果您愿意发布它,能够帮助您破译它会很有用。 -bitmask,我发布了一个后续问题,这不是整个错误集,让我知道是否应该添加更多/更少。 (***.com/questions/60776989/…) 我为您提供了如何理解此类错误under that question 的分步指南。希望对您有所帮助。 【参考方案1】:

问题在于operator [] 可能必须构造一个值对象,在您的情况下为std::pair&lt;foo, foo&gt;。由于foo没有默认构造函数,所以无法构造默认的std::pair

您可以为foo 提供默认构造函数(包括为n 添加默认值),或者您必须使用其他方法将值插入m

【讨论】:

谢谢斯蒂芬,如果我使用m.insert(make_pair(key,make_pair(foo(1),foo(2)))),那么默认构造函数不会被调用,对吗?或者有更好的方法吗,谢谢! 你是对的。您可能想做一些错误检查,否则您的建议很好。

以上是关于将 unordered_map 分配给一对对象的主要内容,如果未能解决你的问题,请参考以下文章

c ++:无法将一对<int,MLine *>插入到unordered_map

预分配 unordered_map 的线程安全

通过右值传递给 unordered_map 时释放内存

将 unordered_map 与动态分配的用户定义类一起使用

为啥我不能用一对作为键来编译 unordered_map?

为啥我不能用一对作为键来编译 unordered_map?