C++ 将对映射到结构

C++ 将对映射到结构,c++,stl,hashmap,C++,Stl,Hashmap,我写过一些代码,但遇到了一些问题,但我试图编写一个简化版本,以重现我遇到的错误: #include <iostream> #include<bits/stdc++.h> using namespace std; struct test{ float y; }; typedef pair<int, int> intpair; map<intpair, test> mp; void func(test &obj){ ob

我写过一些代码,但遇到了一些问题,但我试图编写一个简化版本,以重现我遇到的错误:

#include <iostream>
#include<bits/stdc++.h>

using namespace std;

struct test{
    float y;
};

typedef pair<int, int> intpair;
map<intpair, test> mp;

void func(test &obj){
    obj.y = 23.5;
}



int main () {
   test* obj = new test;
   auto key = make_pair(1,1);
   mp.insert(key, obj);
   func(*obj);
   //cout << *(obj->y);
   delete obj;
   return 0;
}
此外,我确信我访问我的
obj
成员y(cout语句被注释掉)的方式出错了;如何着手解决这些问题?

没有需要密钥和值的重载

可以使用添加新元素:

   mp[key] = *obj;
或者从C++17开始:

   mp.insert_or_assign(key, *obj);
另一点是
obj
的类型为
test*
,而map
mp
的值类型为type
test
。指针应该被取消引用(就像我上面的例子一样),或者值的类型应该被更改为指针来执行此插入。

没有接受键和值的重载

可以使用添加新元素:

   mp[key] = *obj;
或者从C++17开始:

   mp.insert_or_assign(key, *obj);

另一点是
obj
的类型为
test*
,而map
mp
的值类型为type
test
。指针应该被取消引用(如我上面的例子),或者值的类型应该被更改为指针来进行插入。

map mp
中询问您自己,键值对的类型是什么。
object
的类型是否与该类型匹配?intpair基本上是pair的别名,我正在将其映射到创建的结构的实例(应该是*obj)。我想我仍然缺少一些东西,你应该使用
mp.insert(make_pair(key,*obj))
,因为insert需要一对
intpair
test
(不是你代码中的指针)。在
映射mp
中,问问你自己,键值对的类型是什么。
object
的类型是否与该类型匹配?intpair基本上是pair的别名,我正在将其映射到创建的结构的实例(应该是*obj)。我想我仍然缺少一些东西,你应该使用
mp.insert(make_pair(key,*obj))
,因为insert需要一对
intpair
test
(不像你的代码那样是指针)。这很有效!不过,我还有几个后续问题:1)如何访问obj的成员?我试过
cout y)
,但那会出错。2) 现在,我删除了
obj
指针。从映射中删除条目是否也会从内存中删除
obj
?(我相信不会,但我如何删除它?)。现在我尝试了类似于
deletemp[key];mp.擦除(键)
1)
cout y)
不起作用,因为
obj->y
不是指针。它应该是
cout y
不正确。因此,我打算首先释放包含
obj
的内存,然后从映射中删除条目,这样就不会出现内存泄漏。但假设我只能访问
,我只打算使用
mp[key]
来删除/擦除。我有点被卡住了,因为我想,
deletemp[key]
只会在这里删除
*obj
。如何执行此操作?
delete mp[key]
无效,因为
mp[key]
test
)不是指针。不要在此处使用
new
,因为我认为它不是必需的。静态分配
test
的对象。
std::map
和堆栈的信任释放系统。成功了!不过,我还有几个后续问题:1)如何访问obj的成员?我试过
cout y)
,但那会出错。2) 现在,我删除了
obj
指针。从映射中删除条目是否也会从内存中删除
obj
?(我相信不会,但我如何删除它?)。现在我尝试了类似于
deletemp[key];mp.擦除(键)
1)
cout y)
不起作用,因为
obj->y
不是指针。它应该是
cout y
不正确。因此,我打算首先释放包含
obj
的内存,然后从映射中删除条目,这样就不会出现内存泄漏。但假设我只能访问
,我只打算使用
mp[key]
来删除/擦除。我有点被卡住了,因为我想,
deletemp[key]
只会在这里删除
*obj
。如何执行此操作?
delete mp[key]
无效,因为
mp[key]
test
)不是指针。不要在此处使用
new
,因为我认为它不是必需的。静态分配
test
的对象。
std::map
和堆栈的信任释放系统。