2016-03-03 58 views
-2

我想同时循环两张地图,我怎么能做到这一点?在C++中迭代两张地图

我有两个向量要打印两个,我可以做两个时间(auto it : mymap)在一个内?例如:

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

这甚至允许吗?

我试图打印像(value1, value2)这样的值,其中每个值都位于不同的映射中。地图不一定包含完全相同的项目,但关键是一个指令,并且该值是一个整数,所以如果我在地图中有一个元素value2,则不一定对应于相同的密钥有一个value1,但在这种情况下它应该是0,这是默认的整数值。

任何想法?

也许有可能结合两个迭代器,每个映射一个?

亲切的问候, 希丁克Leijsten

+0

您可以嵌套两个循环并获得相同的效果 – TankorSmash

+0

不,该语法无效。你对你想要做什么的描述很复杂,涉及到一堆与解决你的问题无关的信息。让你的问题更简洁。 –

+1

[Go XY在这里。](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)当你有两个或更多的'vector's需要对齐,请考虑使用一个“矢量”和捆绑数据的数据结构。在代码中,更喜欢'struct wrapper {int a; int b;};矢量'over'矢量 a;向量 b;'解决a和b保持同步的所有问题,只需要一个迭代器。 – user4581301

回答

0

您可以使用常规的for循环此:

#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; 
} 

需要注意的是,因为你要遍历不同大小的地图,你必须使用||运算符处于循环条件。直接的后果是你不能在for循环的最后部分递增,因为当时一个迭代器可能是无效的(并导致分段错误)。 您必须检查循环内的迭代器有效性,并在有效时递增它,如上面的示例所示。

+0

感谢您的回答。这很清楚,只需要小心it_m1和it_m2是否指向相同的指令。这将为我解决。再一次感谢 – Guus

+0

不客气。请接受我的回答,以便解决此问题。 – dutiona