Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterating through map keys in C++ 17

Tags:

c++

c++17

I am looking for a way to iterate through the keys of a map in C++ 17. The way that I have in mind right now is based on the answer of this question, the way is presented below.

for (auto const& [i, val] : myMap)
...

However, I do not need to use the value val, I just need the value i. Therefore, the piece of code ... does not contain any call to the value val. Consequently, whenever I compile the code, the following warning message appears:

warning: unused variable ‘val’ [-Wunused-variable]
         for (auto const& [i, val] : myMap){
                                  ^

What I want is to find a way to iterate through (only) the keys of the map, ignoring the values. Does anyone have any idea how to do it?

like image 801
Matheus Diógenes Andrade Avatar asked Dec 25 '19 17:12

Matheus Diógenes Andrade


2 Answers

Does anyone have any idea how to do it?

Sure! You can just use a traditional for loop with an iterator:

for(auto it = myMap.begin(); it != myMap.end(); ++it) {
    auto i = it->first;
    // ...
}
like image 30
πάντα ῥεῖ Avatar answered Sep 23 '22 17:09

πάντα ῥεῖ


Two options:

  1. A ranged-for version of @πάνταῥεῖ 's answer:

    for (auto const& pair : myMap) {
        auto key = pair.first;
        // etc. etc.
    }
    
  2. Use the ranges-v3 library (or std::ranges in C++20) to adapt the range myMap.begin() and myMap.end() by projecting it onto its first coordinate. Then you'd write something like:

    for (auto key : keys_of(myMap) ) {
        // etc. etc.
    }
    

    you can do this without ranges if keys_of() materializes all of the keys, but that could be expensive for a larger map.

    (If you have weird, heavy keys, then const auto& key instead of auto key.)

like image 86
einpoklum Avatar answered Sep 20 '22 17:09

einpoklum