如何在c ++中遍历unordered_map的unordered_map的unordered_map

Posted

技术标签:

【中文标题】如何在c ++中遍历unordered_map的unordered_map的unordered_map【英文标题】:how to traverse in a unordered_map of unordered_map of unordered_map in c++ 【发布时间】:2020-08-14 11:38:27 【问题描述】:

我想遍历一个数据结构 - unordered_map>> myMap。要进一步指定我想获取数据元素,例如 -> 我的地图[someVal1][someVal2] 这个无序映射的所有第二个元素

我知道同样可以通过 3d 数组完成,但是使用 3d 数组效率不高,因为数据范围很大,并且程序最终会使用比所需更多的空间。我尝试使用一些迭代器,如 unordered_map>>::iterator i 和其他几个这样的迭代器,但它总是以某种错误或其他错误结束。有人可以帮助我理解如何遍历这张地图吗?提前致谢!

【问题讨论】:

【参考方案1】:

如果您不想使用迭代器,可以使用 foreach 循环遍历地图(它需要 C++11,我认为这不会有问题)。

myMap mapMapMap;
for(auto& mapMap : mapMapMap)
    for(auto& map : mapMap.second)
        for(auto& key_value : map.second)
            int key = key_value.first;
            int value = key_value.second;
            // ....
        
    

另外,如果您不想迭代所有地图,而只想迭代第三级的值,首先给出两个,那么应该这样做:

int k1, k2;
for(auto& key_value : myMap.at(k1).at(k2))
    //...

【讨论】:

顺便说一句,我不确定它是否有效(所以我没有在答案中包含这个)但也许你可以使用std::unordered_map<int[3], int>,但我不确定它是否可以编译。跨度> 嗯,你在答案中提到的代码可以工作,但我不想使用 3 个循环。假设我想使用单个循环,因为某些值是已知的-(val1 和 val2)。我只想访问 mymap[val1][val2] 中的元素。这可以在一个循环中完成,所以很明显使用多循环只会增加复杂性 @PranavMehta 那么你可以做for(auto& key_value : myMap.get(val1).get(val2)) //... 。我将编辑我的答案以添加该内容

以上是关于如何在c ++中遍历unordered_map的unordered_map的unordered_map的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅地构造在 C 中遍历数组的长参数列表

如何在不知道c中大小的情况下遍历数组[重复]

在C#winform中如何遍历子窗体中所有的控件

如何在 C 中获取目录的大小?

C - 链表 - 如何分配和遍历列表

在C#winform中如何遍历子窗体中有容器中的所有的控件