hash_map (with VS 2003)

This topic is 3768 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

So I have set up my hash_map like this:
struct hashkey
{
int x,z;
enum
{
bucket_size = 4,
min_buckets = 8
};
bool operator()(hashkey s1, hashkey s2) const
{
if (s1.x < s1.x)
return true;
if (s1.x == s1.x)
{
if(s1.z < s1.z)
return true;
else
return false;
}
else
return false;
}
hashkey(int ix,int iz){x=ix;z=iz;}
hashkey(){x=0;z=0;}
};
typedef std::hash_map<hashkey, MapSquare*, hashkey> hashSquares;
hashSquares::iterator sItor;
hashSquares::iterator sDDItor;
hashSquares hSquares;


My problem comes with how to set up the size_t operator() function. Is this my Hashing function?!? I have found some help on the forum, but this is still not working. ANYWAY: I am using this hash to store pointers to elements which have a static x,z cord and I would like them to be able to be fairly sparse. But I need quick lookup and my old method was going through a vector and compairing x,z values to even find if anything even existed at that location. I also need a way to iterate through the structure for filling other data structurs. If anyone has a better solution, or a way to set up an operator() function that returns a size_t properly it would be great. -vs

Share on other sites
The key class probably should not be used as a functor for comparison. That seems bizarre/broken. Instead, you normally create a separate comparison class.

The comparison itself is wrong. For a hash_map, the comparison is for equality, not less-than. The default comparision class is std::equal_to<Key>, so all you really have to do is to implement operator==() for your key class:
    bool operator ==(hashkey const & s) const    {         return s.x == x && s.z == z;    }

Share on other sites
Quote:
 Original post by vs322If anyone has a better solution

stdext::hash_map

Share on other sites
Quote:
Original post by Driv3MeFar
Quote:
 Original post by vs322If anyone has a better solution

stdext::hash_map

in VS 2003 std::hash_map resolves to stdext::hash_map

Share on other sites
Quote:
Original post by vs322
Quote:
Original post by Driv3MeFar
Quote:
 Original post by vs322If anyone has a better solution

stdext::hash_map

in VS 2003 std::hash_map resolves to stdext::hash_map

Yeah, never mind what I said. I'm an idiot.

Share on other sites
Even after making an == operator I couldn't get my key to work. In the meantime I am going to simply use plane old std::map with a LONG as its key.. and have that LONG be made from my 2 int x,z values.(thanks for your time).

Just if some one has personal experience with hash_map vs map is one dramatically faster than the other when retreating values in an extremely non-liner manner?

Share on other sites
I find boost's multi_index hashed_unique to be quite good. A couple other people and myself wrote up a quick test a little while ago comparing std::map with stdext::hash_map and boost's multi_index. The test is at http://rafb.net/p/14CHPC26.html. Pardon the misnomers, this code underwent several revisions and was just thrown together. I'm sure someone could rip into this test and tell me how bad it is, but oh well. PWToolBox is a library my team wrote.

The results of this, running on Windows XP 2.4GHz with 1GB of RAM is http://rafb.net/p/1pbx1P57.html. All times are in seconds.

Share on other sites
Thanks for the test numbers njpaul. I'm not gonna rip your test :)

Well It looks like the boost multi_index is the way to go. ty