为什么我不能在C ++中将对象插入地图

时间:2019-09-11 10:04:03

标签: c++ dictionary insert

所以我有一个应该返回以下映射的函数:
 map<MyObj*, Datastruct>

尝试从包含所述对象的列表中插入对象时:

for(auto element: myList){  
    Datastruct str;  
    str.property1 = element.property1;  
    str.property2 = element.property2;  
    saidMap.insert(element.PointerToMyObj, str);  
}
myList 中的

对象包含一个指向myObj的指针以及一些我需要从列表移动到地图的属性。在以下函数中执行了此代码:

map<MyObj*, Datastruct> listToMap = convertList(myList);

我被编译器大喊:

  

“没有匹配的函数可以调用'std :: map :: insert(MyObj *&,Datastruct&)”

我在这里很无助。我不知道为什么如果myList中的 element 包含

,编译器将显示我试图传递对该函数的引用
  

MyObj * PointerToMyObj;

从我的角度来看,哪种是正确的类型可以传递给insert函数? 我也尝试过

  

std :: make_pair

随后,编译器大喊大叫,试图将对插入
map<MyObj*, Datastruct>.

我完全迷路了。有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:3)

地图的值类型不是

std::pair<MyObj*, Datastruct>

但是

std::pair<MyObj* const, Datastruct>

大概是您在某处对配对类型进行了硬编码,但是错过了const

或者,如果您编写了saidMap.insert(std::make_pair(element.PointerToMyObj, str)),那应该行得通,而代码中还有其他问题。


但是使用emplace要容易得多:

saidMap.emplace(element.PointerToMyObj, str);  

insert的C ++ 11版本具有使该功能“透明”运行所需的所有魔术机制。

答案 1 :(得分:1)

您的代码几乎是 。由于map::insert确实没有这样的重载,您会收到此编译器错误。在阅读std::map文档时,您会错过一个很小的细节。这样map::insert不能用作隐式构造函数,这就是您尝试在粘贴的代码中使用它的方式。 您可以通过添加-map::emplace

for(auto element : myList){  
  Datastruct str;  
  str.property1 = element.property1;  
  str.property2 = element.property2;  
  saidMap.emplace(element.PointerToMyObj, str);
}

使用map::insert():插入功能用于在地图中插入 键值 ,并且具有3个< em> general 重载实际上更多,但是这些是如何在地图中插入的主要思想。

  • insert(pair):只需在映射中插入一个新对,其中pair.first是key,pair.second是value。仅在键尚未在地图中时发生。
  • insert(it,pair):使用一个迭代器和一个对进行插入,其中it是指向要在其中插入对的位置的指针。
  • insert(开始,结束):用于通过接受迭代器到另一张地图的元素来复制另一幅地图的beginend

在您的情况下,您实际上错过了通过pair的机会。您可以在插入参数列表内部构造它,如下所示:

for(auto element : myList){  
  Datastruct str;  
  str.property1 = element.property1;  
  str.property2 = element.property2;  
  saidMap.insert( /*implicitly derive a pair as:*/ { element.PointerToMyObj, str } );
}

注意:这是 post-C ++ 11 功能,因此请确保至少将编译器的C ++版本设置为该版本。

我已在 Compiler Explorer(godbolt)中使用map::insert的工作版本复制了您的代码,供您查看(在gcc和{{1 }}编译器):https://godbolt.org/z/7Mqut0

希望这会有所帮助!