繁体   English   中英

如何将指针映射到unordered_map中的对象?

[英]How to map pointer to object in unordered_map?

可以说我有一个结构作为value

struct Friend { Person * a, Person* b}

然后,我有另一个类的key

class Relation;

现在我要创建一个键值关系

std::unordere_map<Relation*, Friend> my_map;

我努力了

Relation* r; 
Person * p1;
Person * p2;
my_map[r] = {p1, p2}; // works

my_map[r] = new Friend(p1,p2); // does not work 
// error says : error: no match for 'operator='

// my_map[r] = Friend(p1, p2); /// also does not work
 // After Edit from Zan
// error: no matching function for call to 'Friend::Friend()'


struct Friend { 
     Friend(Person* x, Person* y){
     a = x;
     b = y;
     }

     Person * a;
     Person* b;
}

Friend != Friend* 如果声明一个以Friend为值的std::unordered_map ,则不能使用Friend* ,反之亦然。

但是我不明白你要做什么。 对我来说,这听起来像是XY问题。 Relation类的目的是什么? 只是为了表达Person* ab之间的关系? 如果真是这样,那么该数据结构不适合您的目的。

通过使用std::unordered_map<Relation*, Friend>您将指针用作键,但是谁来管理Relation的内存呢? 谁拥有它?

也许您只需要一个std::unordered_map<Person*, Person*>来存储相互关系,或者如果您想交易性能以避免存储可传递条目,则只需std::set<Friend>

没有人真正解决过您遇到的错误。 我认为您的注释错误在这里:

// my_map [r] = Friend(p1,p2); ///也不起作用
//错误:没有匹配的函数可以调用'A :: A()'

来自先前的代码,而A::A()实际上是Friend::Friend() 该错误的原因是my_map[r]必须先创建默认的Friend值,然后才能执行其他任何操作。 operator[]函数必须具有可以返回引用的内容。

如果您定义了一个默认的构造函数,将您的Person*值设置为NULL或nullptr或0,则您的代码将开始工作,除非指出了其他问题。

不必担心此处的性能。 在优化中,编译器将看到将值写入0,然后再写入真实值而不会被读取,并且它将删除对0的首次写入。

尝试删除新的。 您正在尝试在地图中存储一个Friend *而不是Friend。 如果您跳过了新的内容,它应该在堆栈中创建一个,然后将其移动到地图中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM