标准映射的基于范围的迭代
在 C 11 及更高版本中,基于范围的 for() 循环提供了一种方便的迭代语法通过容器。然而,它们在映射等复杂数据结构中的行为可能会令人困惑。
考虑以下示例:
<code class="cpp">std::map<foo, bar> testing = /*...initialized...*/; for (auto abc : testing) { std::cout << abc << std::endl; }</code>
此循环中 abc 的类型是什么?它会产生 foo 键、bar 值还是迭代器?
分辨率
在 C 11 和 C 14 中,基于范围的循环迭代映射的键-值对。因此 abc 的类型是 std::pair
要单独检索键和值,您可以使用该对的第一个和第二个成员:
<code class="cpp">for (auto abc : testing) { std::cout << abc.first << " has value " << abc.second << std::endl; }</code>
请注意,循环中的变量通常被声明为 const,以表示它们不会修改地图的内容。
C 17 及以上
In C 17 中,为基于范围的映射迭代引入了一种方便的简写符号:
<code class="cpp">for (const auto& [key, value] : testing) { std::cout << key << " has value " << value << std::endl; }</code>
此语法直接用键和值替换第一个和第二个成员。这允许对键值对进行更清晰、更简洁的迭代表达。
其他注意事项
<code class="cpp">for (auto& kv : testing) { std::cout << kv.first << " had value " << kv.second << std::endl; kv.second = "modified"; // Modifies the map's value }</code>
以上是基于范围的迭代如何与 C 中的标准映射配合使用以及不同版本之间的语法有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!