【问题标题】:Iterating through two maps in c++在 C++ 中遍历两个映射
【发布时间】:2016-03-03 22:35:24
【问题描述】:

我想同时循环遍历两张地图,我该如何实现呢?

我有两个向量想要同时打印,我可以在一个内做两次(auto it : mymap) 吗?比如:

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

这是否允许?

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

有什么想法吗?

也许可以组合两个迭代器,每个映射一个?

亲切的问候, Guus Leijsten

【问题讨论】:

  • 可以嵌套两个循环,达到同样的效果
  • 不,该语法无效。您对您想要做什么的描述很复杂,并且涉及大量与解决您的问题无关的信息。让你的问题更简洁。
  • Going X-Y here. 当您有两个或多个vectors 需要对齐时,请考虑使用一个vector 和一个捆绑数据的数据结构。在代码中,更喜欢 struct wrapper {int a; int b;}; vector<wrapper> 而不是 vector<int> a; vector<int> b; 解决了保持 a 和 b 同步的所有问题,并且只需要一个迭代器。
  • @TankorSmash 听起来你建议的是 M * N 循环迭代,而我相信 OP 在 M == N 的 M 循环迭代之后。

标签: c++ hashmap


【解决方案1】:

您可以为此使用常规的 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 循环的最后部分增加,因为当时其中一个迭代器可能无效(并导致分段错误)。 您必须检查循环内的迭代器有效性并在其有效时将其递增,如上面的示例所示。

【讨论】:

  • 感谢您的回答。这很清楚,只需要注意it_m1和it_m2是否指向同一条指令。这对我有用。再次感谢
  • 不客气。请接受我的回答,以便解决问题。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2012-05-14
相关资源
最近更新 更多