2010-01-18 29 views
0

我有一个Boost unordered_map是否仅用于将项目与整数相关联?

HashMap<Node, Double> 
在Java中

,我会用以后检索与节点相关联的两倍。我试着做

boost::unordered_map<Node*, double> 

但我得到一个“错误C2108:标不是整体式的”当我试图把东西在里面,比如:

map[some_node] = some_double; 

如果我解释错误的权利,那么我必须用int替换我的double。有没有简单的方法呢?

没关系,这里的功能,那么:

void myClass::someFunction(const double* r) 
{ 
    //map is boost::unordered_map<Node*, double> 
    //nodes is a pointer to std::vector<Node*> 
    std::vector<Node*>::iterator it; 
    for(it = nodes->begin(); it != nodes->end(); it++) 
    { 
     //calculate the index 
     map[*it] = r[index]; //error 
    } 
} 

回答

1

与Java不同,C++不提供类的哈希函数。如果hashmap key的类型是一个整数或指针,那么C++可以使用这样一个事实,即一个整数是它自己的散列,但它不能用于你自己定义的类型 - 在这种情况下,你必须提供一个散列功能明确。这可能很难有效地执行,这是哈希被排除在原始C++标准之外的原因之一,它支持使用树结构而不是哈希表的映射,并且只需要定义运算符<(),这通常是比高效的散列函数更容易编写。

我还会观察到,如果您使用指向节点的指针作为散列键,则可以更轻松快捷地将double值存储在节点本身中,而不是使用散列表,因为您已经有效地有你想要交的节点。

+0

虽然这不是我正在寻找的,但你是对的。最好将double添加到Node中。 – zxcvbnm 2010-01-18 17:31:53

0

这不是抱怨双,它在抱怨“some_node”。

什么是您的地图具体定义?

0

你不给some_node的声明,但如果some_node不是指针,你会得到这个错误。双重应该没问题。

所以,你可能需要的东西是这样的:

Node some_node; 
... 
map[&some_node] = some_double; 
1

的错误是不是地图的访问,但对于r[index]index必须是整数类型。

+0

噢,不能相信我没有注意到。我宣布索引为双。谢谢! – zxcvbnm 2010-01-18 17:05:26

相关问题