如何在C++中循环遍历std::map
?我的map定义如下:
std::map< std::string, std::map<std::string, std::string> >
例如,上面的容器保存如下数据:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
如何循环遍历这个Map并访问不同的值?
9条答案
按热度按时间envsm3lx1#
旧问题,但其余的答案在C++11时已过时-您可以使用ranged based for loop并简单地执行以下操作:
这应该比以前的版本干净得多,并避免不必要的复制。
一些人赞成用引用变量的明确定义来代替注解(如果不使用,引用变量会被优化掉):
针对C++17的更新:现在可以使用结构化绑定来进一步简化这一点,如下所示:
kyvafyod2#
可以使用迭代器。
7fhtutme3#
或更好的C++0x:
sr4lhrrt4#
在C++17(或更高版本)中,您可以使用“结构化绑定”功能,该功能允许您使用单个元组/对定义多个变量,使用不同的名称。
original proposal(由名人Bjarne Stroustrup、Herb Sutter和Gabriel Dos Reis编写)读起来很有趣(而且建议的语法更直观,恕我直言);还有proposed wording for the standard,读起来很无聊,但更接近实际内容。
vh0rcniy5#
请执行以下操作:
blmhpbnm6#
C++11:
输出:
ipakzgxi7#
正如在their answer中提到的 einpoklum,由于C++17,你也可以使用structured binding declarations。我想通过提供一个完整的解决方案来扩展它,以一种舒适的方式迭代Map的Map:
输出:
m[名称1][值1]=数据1
m[名称1][值2]=数据2
m[名称2][值1]=数据1
m[名称2][值2]=数据2
m[名称3][值1]=数据1
m[名称3][值2]=数据2
m
,则必须删除const
关键字。Code on Coliru
x9ybnkn68#
Map恒定时使用
std::map< std::string, std::map<std::string, std::string> >::const_iterator
。fcipmucu9#
第一个解决方案是使用range_based for循环,如下所示:
注意:当
range_expression
的类型为std::map
时,则range_declaration
的类型为std::pair
。代码1:
第二种解决方案:
代码2