Guus
Guus

Reputation: 53

Iterating through two maps in c++

I would like to loop through two maps at the same time, how could I achieve this?

I have two vectors want to print both, can I do two time (auto it : mymap) within one for? Something like:

for (auto it: mymap && auto on: secondMap)

is this even allowed?

I am trying to print values like (value1, value2) where each of the values is in a different map. The maps do not necessarily contain the exact same items but the key is an Instruction and the value is an integer, so if I have a element in the map for value2, then not necessarily there is a value1 corresponding to the same key, but in that case it should be 0 which is the default integer value.

Any ideas?

Perhaps it is possible to combine two iterators, one for each map?

Kind regards, Guus Leijsten

Upvotes: 2

Views: 11626

Answers (1)

dutiona
dutiona

Reputation: 481

You can use the regular for-loop for this :

#include <iostream>
#include <map>


int main(int argc, char* argv[]) {
    std::map<int, std::string> m1, m2;

    m1.insert({15, "lala"});
    m1.insert({10, "hey!"});
    m1.insert({99, "this"}); 

    m2.insert({50, "foo"});
    m2.insert({51, "bar"});


    for(auto it_m1 = m1.cbegin(), end_m1 = m1.cend(),
        it_m2 = m2.cbegin(), end_m2 = m2.cend();
        it_m1 != end_m1 || it_m2 != end_m2;)
    {
        if(it_m1 != end_m1) {
            std::cout << "m1: " << it_m1->first << " " << it_m1->second << " | ";
            ++it_m1;
        }

        if(it_m2 != end_m2) {
            std::cout << "m2: " << it_m2->first << " " << it_m2->second << std::endl;
            ++it_m2;
        }
    }

    return EXIT_SUCCESS;
}

Note that because you want to iterate over maps of different size, you have to use the || operator in loop condition. The direct consequence is that you cannot increment in the last part of the for-loop, as one of the iterator may be invalid at that time (and lead to a segmentation fault). You have to check iterator validity inside the loop and increment it when it's valid, as shown in the sample above.

Upvotes: 8

Related Questions