开发者

Does the Boost unordered_map only work to associate items with integers?

I had a

HashMap<Node, Double> 

in Java which I'd use later on to retrieve the double associated with a node. I've tried to do

boost::unordered_map<No开发者_如何学运维de*, double> 

but I get a "error C2108: subscript is not of integral type" when I try to put something in it, like:

map[some_node] = some_double;

If I interpreted the error right, then I have to replace my double with an int. Is there a simple way around this?

okay, here's the function then:

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
    }
}


Unlike Java, C++ does not provide hashing functions for classes. If the type of the hashmap key is an integer or a pointer, then C++ can use the fact that an integer is its own hash, but it can't fo this for types you define yourself - in that case you have to provide a hash function explicitly. This can be hard to do efficiently, which is one reason that hashes were excluded from the original C++ standard in favour of maps that use a tree structure rather than a hash table, and only require operator<() to be defined, which is usually much easier to write than an efficient hash function.

I'd also observe that if you are using a pointer to a node as the hash key, it may be easier and quicker to store the double value in the node itself, rather than use a hashtable, as you effectively already have the node you want to hand.


The error is not for the map access, but for r[index]. index must be an integer type.


It's not complaining about the double, it's complaining about "some_node".

What is your map defined as specifically?


You don't give the declaration of some_node but you would get this error if some_node is not a pointer. The double should be fine.

So you might need something like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜