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

时间:2016-11-18 16:54:51

标签: c++ c++11

假设我的结构为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;
}

3 个答案:

答案 0 :(得分:2)

Friend != Friend*。如果您声明std::unordered_map的值为Friend,那么您就无法使用Friend*而反之亦然。

但我不知道你想要做什么。这听起来像是一个XY问题。 Relation班级的目的是什么?它只是表达Person* ab之间的关系?如果是这种情况,则数据结构不适合您的目的。

使用std::unordered_map<Relation*, Friend>您使用指针作为键但管理Relation的内存?谁拥有它?

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

答案 1 :(得分:2)

没有人真正解决过你的错误。我假设你的注释错误在这里:

  

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

来自之前的代码,而A::A()实际上是Friend::Friend()。该错误的含义是my_map[r]必须首先创建默认的Friend值才能执行任何其他操作。 operator[]函数必须能够返回对它的引用。

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

不要担心这里的表现。在优化中,编译器将看到值写入0然后写入实际值而不会被读取,它将删除第一次写入0。

答案 2 :(得分:0)

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