Iterating in order over an unordered map

Started by
3 comments, last by wack 10 years, 5 months ago

I have an std::unordered_map<MyStruct>. It's unordered for extra-fast lookups which is what will be needed most of the time. However, once, at startup, I'd like to iterate over it in order of MyStruct::myInt.

The container currently contains upwards of 2000 elements, and might reach as high as 5-10 thousand.

Is there some way I can iterate over it in an order other than its internal hashing order?

I'm not worried about speed.

Advertisement

No.

If you know the keys used you can sort them and then look up the items in order.

You could put them in a map and iterate over them (and use the map to fill the unordered_map) then throw the map away.

"Most people think, great God will come from the sky, take away everything, and make everybody feel high" - Bob Marley

Alright, thanks.

I'm now using a temporary map of references:


std::map<Key, std::reference_wrapper<Value>> sortedMap(std::begin(unsortedMap), std::end(unsortedMap));

for(const auto &pair : sortedMap)
{ ... }

I'm pretty sure boost::multi_index (http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/index.html) can do what you're asking for. You can set up a sequential index and an unordered index.

I'm pretty sure boost::multi_index (http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/index.html) can do what you're asking for. You can set up a sequential index and an unordered index.


Thanks for the tip about multi_index. Just used it to clean up a monstrosity with multiple containers that I created a while back.

Boost contains so much, it's tricky to really get an overview of the stuff you acually need sometimes...

This topic is closed to new replies.

Advertisement