首页  >  文章  >  后端开发  >  基于范围的迭代如何与 C 中的标准映射配合使用以及不同版本之间的语法有何不同?

基于范围的迭代如何与 C 中的标准映射配合使用以及不同版本之间的语法有何不同?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-30 02:49:28980浏览

How does range-based iteration work with standard maps in C   and how does the syntax differ across versions?

标准映射的基于范围的迭代

在 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>

此语法直接用键和值替换第一个和第二个成员。这允许对键值对进行更清晰、更简洁的迭代表达。

其他注意事项

  • 可以在循环内修改地图的内容使用声明为 auto& 的引用变量:
<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>
  • 如果映射的值很大,则使用带有迭代器的基于范围的循环而不是对对象可能会更有效。然而,这消除了基于范围的 for 循环提供的一些便利。

以上是基于范围的迭代如何与 C 中的标准映射配合使用以及不同版本之间的语法有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn