2013-03-15 88 views
3

我有一个问题,可能有一个简单的解决方案,但我已经环顾了一会儿,仍然没有成功。插入自定义类到unordered_map C++

我有一个简单的类,如下所示:

class Node{ 
public: 
int value; 
bool visited; 
Node(int argvalue) {value = argvalue;visited = false; } 
bool operator==(const Node& n) {return (value == n.value);} 
}; 

class MyHash { 
size_t operator()(const Node& x) const { return std::hash<int>()(x.value); } 
}; 

现在,当我尝试插入,我得到错误,不明白为什么?我是否错误地实现了我的散列函数,或者是否等于运算符==不够?

unordered_map<Node, int, MyHash> my_items; 
my_items.insert(Node(33), 894); 
+0

那会是什么错误?它会帮助其他任何得到相同错误的人能够找到你的问题。 – 2013-03-15 08:22:23

回答

8

尽管如此two-parameter insert methods的匹配insert(key_type, mapped_type),这是您正在尝试什么。

地图拥有std::pair<const Key, T>,所以你需要插入一对,无论是明确的:

my_items.insert(std::make_pair(Node(33), 894)); 

或使用大括号初始化:

my_items.insert({Node(33), 894}); 

您可以使用std::unordered_map::emplace成员函数,它允许你通过一对构造函数参数:

my_items.emplace(Node(33), 894); 

周其他的事情:

  • bool Node::operator==应该是const(比较不应该改变的对象进行比较)
  • size_t MyHash::operator()(...) const应该是公开的。
+0

或更简单'my_items [Node(33)] = 894;'? – Dukeling 2013-03-15 06:55:10

+2

@Dukeling类型,但是它具有不同的语义:如果一个键的值等于Node(33)的元素已经存在,它会替换映射的值。 – juanchopanza 2013-03-15 06:56:45

+1

我们不要忘记'my_items.emplace(Node(33),894)',它的工作原理与OP期望的一样。尽管如此,它可能没有很好的编译器支持。 – Grizzly 2013-03-15 08:01:31

0

您有几个错误。首先,operator()MyHash中的private,因为它是一个类,类的默认访问是私有的。将其标记为public或将其更改为struct MyHash

其次,你不能插入这样的值。它将需要像my_items.insert(std::make_pair(Node(33), 894));