Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Obtaining list of keys and values from unordered_map

What is the most efficient way of obtaining lists (as a vector) of the keys and values from an unordered_map?

For concreteness, suppose the map in question is a unordered_map<string, double>. I'd then like to obtain the keys as a vector<string>, and the values as a vector<double>.

unordered_map<string, double> um;  vector<string> vs = um.enum_keys(); vector<double> vd = um.enum_values();  

I can just iterate across the map and collect the result, but is there a more efficient method? It would be nice to have a method that also works for regular map, since I might switch to that.

like image 903
Faheem Mitha Avatar asked Dec 13 '11 03:12

Faheem Mitha


People also ask

How do I get the value of an unordered map?

unordered_map at() in C++ Both key and value can be of any type predefined or user-defined. unordered_map :: at(): This function in C++ unordered_map returns the reference to the value with the element as key k.

How do I get the key back from a map in C++?

C++ map find() function is used to find an element with the given key value k. If it finds the element then it returns an iterator pointing to the element. Otherwise, it returns an iterator pointing to the end of the map, i.e., map::end().

How do you check if a key is present in unordered_map?

To check for the existence of a particular key in the map, the standard solution is to use the public member function find() of the ordered or the unordered map container, which returns an iterator to the key-value pair if the specified key is found, or iterator to the end of the container if the specified key is not ...

What does unordered_map return?

Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.


1 Answers

Okay, here you go:

std::vector<Key> keys; keys.reserve(map.size()); std::vector<Val> vals; vals.reserve(map.size());  for(auto kv : map) {     keys.push_back(kv.first);     vals.push_back(kv.second);   }  

Efficiency can probably be improved, but there it is. You're operating on two containers though, so there's not really any STL magic that can hide that fact.

As Louis said, this will work for any of the STL map or set containers.

like image 113
Keith Layne Avatar answered Sep 19 '22 23:09

Keith Layne