[英]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*
a
和b
之间的关系? 如果真是这样,那么该数据结构不适合您的目的。
通过使用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.