为什么 auto 在 C++ 中的 2D 和 1D 数组的“range for”中工作方式不同

2024-03-27

您好,我正在 C++ 中处理 2D 和 1D 数组并使用范围为访问元素。我使用的代码如下:

对于二维数组

int ia[3][4] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (auto& row : ia) {
    for (auto col : row) {
        cout << col << endl;
    }
}

对于 ID 数组

int base_array[2] = { 1, 2 };
for (auto p : base_array) {
    std::cout << p << std::endl;
}

正如我们在二维数组的循环外部范围中看到的,控制变量row必须是引用类型,这样数组到指针的自动转换就不会发生,并且我们可以循环遍历本身就是大小为 4 的数组的元素。但是在一维数组中我们没有使用控制变量p作为引用类型,即使这样我们也能够遍历一维数组。我的问题是为什么在一维数组中没有发生数组到指针的转换?如果控制变量不是引用类型,它是如何工作的?也就是说,为什么(如何)是p of int键入而不是int*在一维数组的情况下,如果我们省略控制变量中的引用符号row然后它将变成 int* 但当我们在变量前面包含引用符号时row那么它就会变成数组类型。为什么会有这种行为差异?


在您的一维情况下, base_array 不会衰减,因为它存在于与 for 循环相同的范围内。所以基于范围的 for 可以正确地计算出它的范围。确实如此,一维并没有衰减。如果您尝试通过函数传递该一维数组,您会发现基于范围的 for 变得不可能,因为它会衰减,除非您将其作为引用传递。

在你的二维情况下,如果你允许row衰变到int*,嵌套的 for 不能再假设您必须表示数组。因此,您可以使用以下方法保留类型auto&,让嵌套的 for 知道你在说什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 auto 在 C++ 中的 2D 和 1D 数组的“range for”中工作方式不同 的相关文章

随机推荐

  • 当对象包含 ng-repetate 时,如何使用 angularFire 保存 Firebase 对象 $asArray()

    我最近从 angularfire 0 6 切换到 0 8 0 我在保存包含数组本身的列表项时遇到问题 我的对象account看起来像这样 JQruasomekeys0nrXxH created 2014 03 23T22 00 10 176
  • Python 与格式 '%Y-%m-%dT%H:%M:%S%Z.%f' 不匹配

    我尝试在Python中将字符串转换为日期时间对象 但我找不到我的格式有任何问题 Y m dT H M S Z f import datetime datetime datetime strptime 2019 11 19T17 22 23
  • 使用 getFilesDir() 时应用程序上下文返回 null

    我不知道为什么会发生这种情况 当我检查 DDMS 时也没有文件目录 我正在尝试在我的应用程序子类中访问此文件夹 知道为什么会发生这种情况吗 我需要应用程序上下文是全局的 这样我就可以在不扩展 Activity 的类上使用 package m
  • Selenium-Webdriver:找到元素后获取属性

    我对自动化的东西还很陌生 所以这听起来像是一个愚蠢的问题 在发布问题之前 我确实用谷歌搜索了它 不管怎样 问题就在这里 我正在 Android 设备上进行自动化测试 其中一项测试是验证某个项目是否已被标记为 收藏夹 页面代码片段为 li c
  • Android Studio 2.3 错误:无法加载类“com.google.common.collect.ImmutableSet”

    大家 突然 当我打开现有项目时 出现错误 错误 无法加载类 com google common collect ImmutableSet 导致此意外错误的可能原因包括 格拉德尔的 依赖项缓存可能已损坏 这有时会在网络连接后发生 连接超时 重
  • 创建基类对象的向量并在其中存储派生类对象

    我正在尝试创建一个员工数据库 员工向量 有 3 种类型的员工 即 Employees 是基类 Manager Engg 和 Scientist 是派生类 每个员工都有名字和姓氏 除了名字之外 这 3 种类型的员工中的每一种都有独特的统计数据
  • javascript date.utc 问题

    我正在尝试使用 javascript 比较 2 个日期 月末 1 个 月初 1 个 我需要以秒为单位比较这两个日期 因此我使用 Date UTC javascript 函数 这是代码 var d Date UTC 2010 5 31 23
  • 实体框架中推荐的身份生成方法是什么?

    我对 StoreGeneratePattern 的最高效的方式感兴趣 过去我习惯让数据库为我生成ID 但我想知道设置是否有任何优势 StoreGeneratedPattern None 代替 StoreGeneratedPattern Id
  • Demean R 数据框

    我想贬低 R 中的多列data frame 使用来自的示例这个问题 https stats stackexchange com questions 46978 fixed effects using demeaned data why di
  • android maven插件在Eclipse中没有获取ANDROID_HOME环境变量

    我正在开发一个 Android 应用程序项目 它是一个 Maven 项目 当我尝试作为 maven install 运行时 这就是我得到的 无法在项目 android client 上执行目标 com jayway maven plugin
  • 如果给定空白正则表达式,则 regex_replace 中的 C++ Mac OS 无限循环

    执行后 std regex replace the string std regex doesn t matter 我的 Mac 将无限期挂起 我是 xcode 新手 但我认为我正确使用它 我在调试程序时点击 暂停 发现最后执行的代码位于正
  • 无法通过Java删除目录

    在我的应用程序中 我编写了从驱动器中删除目录的代码 但是当我检查文件的删除功能时 它不会删除该文件 我写过一些这样的东西 Code to delete the directory if it exists File directory ne
  • javaFX 表视图中的错误

    I make TableView在 javaFX 中包含两个TableColumns TableView Span 的宽度大于所有的宽度TableColumn 但这不是问题 我不明白的是 当我单击包含数据的行外部区域和列外部区域 红色区域
  • 在哪里可以找到已实施的耐心差异?

    这个网站上有很好的答案 Bram Cohen 的耐心 diff 在 bazaar 中作为默认 diff 和 git diff 的一个选项找到 但我发现很难找到一个独立的独立程序来实现这个特定的 diff 算法 例如 我想将 Patient
  • 根据列表中的值将列添加到数据框

    我有一个如下所示的数据框 df lt data frame A c a b c d e f g h i B c 1 1 1 2 2 2 3 3 3 C c 0 1 0 2 0 4 0 1 0 5 0 7 0 1 0 2 0 5 gt df
  • PHP 发送邮件表单到多个电子邮件地址

    我对 PHP 非常陌生 正在联系页面上使用基本模板 发送邮件 表单 当单击 提交 按钮时 要求我将电子邮件发送到多个电子邮件地址 我已经四处搜寻 但还没有找到我需要的东西 我需要在下面的表单中添加什么代码才能将其发送到多个电子邮件地址
  • Tensorflow.Keras:自定义约束不起作用

    我正在尝试实现权重正交约束所示here https towardsdatascience com build the right autoencoder tune and optimize using pca principles part
  • 创建具有命名子组件的组件?

    我需要了解使组件生成和管理子组件背后的基础知识 我最初通过创建一个来尝试这个TCollection 并尝试为每个人命名TCollectionItem 但我知道这并不像我希望的那么容易 所以现在我要再次从头开始这个项目 我想这次能做对 这些子
  • 在特定数量的分隔符后添加 '\n'

    我怎样才能添加一个 n每四次之后 CSV 文件中的分隔符 使用 bash 输入文件示例 aaaa bbbbbb cccc ddddd eeee ffff gggg hhhh iii jjjj kkkk llll 需要输出 aaaa bbbb
  • 为什么 auto 在 C++ 中的 2D 和 1D 数组的“range for”中工作方式不同

    您好 我正在 C 中处理 2D 和 1D 数组并使用范围为访问元素 我使用的代码如下 对于二维数组 int ia 3 4 1 2 3 4 5 6 7 8 9 for auto row ia for auto col row cout lt