首页 > 后端开发 > C++ > 正文

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

Mary-Kate Olsen
发布: 2024-10-30 02:49:28
原创
979 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!