在 std::map 中使用基于范围的 for() 循环
C 11 及更高版本中基于范围的 for() 循环提供一种迭代容器的便捷方法。虽然示例经常展示矢量等简单容器,但将它们与地图等更复杂的数据结构一起使用时会出现混乱。
当对地图使用基于范围的 for() 循环时,元素类型并不那么简单看起来。考虑以下示例:
<code class="cpp">std::map<foo, bar> testing = { /*...blah...*/ }; for (auto abc : testing) { std::cout << abc << std::endl; // ? should this give a foo? a bar? std::cout << abc->first << std::endl; // ? or is abc an iterator? }</code>
与向量不同,循环变量是容器元素的类型(例如 int),映射的循环变量 abc 实际上是 std::pair< 类型;const foo, bar>.这意味着 abc 持有一对包含映射的键和值的对。
在 C 17 及更高版本中,您可以使用结构化绑定直接访问键和值:
<code class="cpp">for (auto& [key, value] : myMap) { std::cout << key << " has value " << value << std::endl; }</code>
在 C 11 和 C 14 中,您仍然可以使用增强的 for 循环迭代映射,但是您必须手动提取键和值:
<code class="cpp">for (const auto& kv : myMap) { std::cout << kv.first << " has value " << kv.second << std::endl; }</code>
重要的是要理解循环变量 abc 或这些示例中的 kv 不是迭代器。相反,它表示包含当前映射元素的键和值的对的副本。在考虑对循环内的地图元素进行修改或引用时,这种区别至关重要。
以上是基于范围的 for() 循环如何与 C 中的 std::map 一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!