I was writing an algorithm this morning and I ran into a curious situation. I have two std::map
s. I want to perform a set intersection on the sets of the keys of each (to find which keys are common to both maps). At some point in the future, I think it's likely I'll also want to perform set subtraction here as well. Luckily, the STL includes functions for both of those operations. The problem is, I can't seem to get a std::set
of the keys out of a std::map
. Is there any way to do this? I'm looking for something that would be this simple, like it is in Java:
std::set<Foo> keys = myMap.getKeySet();
My understanding is that I can't use the std::set_intersection()
function directly on iterators into the maps because the maps expose std::pair
objects instead of just keys. Also, I don't think the map guarantees order. I'm also interested in performing this same operation on a pair of std::multimap
s, if that makes any difference.
EDIT: I forgot to mention initially that due to the age of the compiler I'm forced to use (MSVC++ 6), most of the nifty template tricks that are available in boost can not be used.
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 ...
Search by value in a Map in C++Given a set of N pairs as a (key, value) pairs in a map and an integer K, the task is to find all the keys mapped to the give value K. If there is no key value mapped to K then print “-1”. Explanation: The 3 key value that is mapped to value 3 are 1, 2, 10.
a map will not throw any compile/run time error while inserting value using duplicate key. but while inserting, using the duplicate key it will not insert a new value, it will return the same exiting value only. it will not overwrite.
The standard solution to insert new elements into a map is using the std::map::insert function. It inserts the specified key-value pair into the map only if the key already doesn't exist. If the key already exists in the map, the element is not inserted.
What you basically want is a copy, as std::map doesn't keep the keys in a std::set. std::copy assumes that the value types are compatible, which isn't the case here. The std::map::value_type is a std::pair. You want to copy only the first part of the pair, which means you need a std::transform. Now, since you will be using an insert_iterator on the set, order doesn't matter. The std::set will sort on insertion, even though the map was already sorted.
[edit] Code might be easier. Top of my head, not compiled.
std::transform(MyMap.begin(), MyMap.end(), std::inserter(MySet, MySet.end()), boost::bind(&std::pair<Key,Value>::first, _1));
If you've got SGI's select1st, you don't need the boost::bind.
[edit] Updated for C++14
std::transform(MyMap.begin(), MyMap.end(), std::inserter(MySet, MySet.end()), [](auto pair){ return pair.first; });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With