Iterating in order over an unordered map

Recommended Posts

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?

Edited by Servant of the Lord

Share on other sites

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.

Share on other sites

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)
{ ... }

Share on other sites

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

Create an account

Register a new account

• Forum Statistics

• Total Topics
628383
• Total Posts
2982384

• 10
• 9
• 15
• 24
• 11