C++ 中向量是通过值还是通过引用传递给函数

2023-11-22

我正在用 C++ 编码。如果我有一些功能void foo(vector<int> test)我在程序中调用它,向量将按值传递还是按引用传递?我不确定,因为我知道向量和数组是相似的,并且像这样的函数void bar(int test[])将通过引用(指针?)而不是通过值通过测试。我的猜测是,如果我想避免按值传递,则需要显式地通过指针/引用传递向量,但我不确定。


在 C++ 中,事物按值传递,除非您使用&- 运算符(请注意,该运算符也用作“地址”运算符,但在不同的上下文中)。这一切都有据可查,但我还是要重申一下:

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference

您还可以选择将指针传递给向量(void foo(vector<int> *bar)),但是除非您知道自己在做什么并且您觉得这确实是正确的选择,否则不要这样做。

另外,向量是not和数组一样!在内部,向量会跟踪一个数组,并为您处理内存管理,但许多其他 STL 容器也是如此。您不能将向量传递给需要指针或数组的函数,反之亦然(您可以访问(指向)底层数组并使用它)。向量是通过其成员函数提供许多功能的类,而指针和数组是内置类型。此外,向量是动态分配的(这意味着大小可以在运行时确定和更改),而 C 样式数组是静态分配的(其大小是恒定的并且必须在编译时已知),这限制了它们的使用。

我建议您阅读更多有关 C++ 的一般知识(特别是阵列衰减),然后看一下下面的程序,它说明了数组和指针之间的区别:

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中向量是通过值还是通过引用传递给函数 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 为什么java主类中需要main()方法

    我知道我们可以在没有main 方法的情况下成功编译和运行java程序 但是为什么我们仍然需要在java的主类中使用main 方法呢 每个 Java 应用程序都必须包含一个 main 方法 其签名如下所示 public static void
  • 将项目附加到可变参数函数包装器而不重新分配新切片

    好的 我需要一个 fmt Printf 的小包装以方便调试 1 调用 fmt Fprintln 时参数过多 func Debug a interface if debug fmt Fprintln out prefix sep a 2 接口
  • 将 Django 连接到 Google Cloud SQL

    我正在尝试将 Django 连接到 Google 云 SQL 在 Windows 下使用 python 2 7 和 django 1 5 我浏览了此页面上的说明 https developers google com appengine d
  • 无需递归函数调用的排列

    要求 算法生成集合的所有可能组合 不重复 或递归调用函数返回结果 大多数 如果不是全部的话 的答案在JavaScript 中的排列 从循环或其他函数中递归调用函数以返回结果 循环内递归函数调用的示例 function p a b res v
  • phpMyAdmin 不显示添加的列

    自从我得到 phpMyAdmin 3 5 2 2 以来 出现了一个奇怪的问题 当我向特定表添加新列时 它不会显示在概述中 这个问题只出现在一张表上 其他都正常 在设置中找不到某些内容 我也有过这样的经历 XAMPP 1 8 1 PHP 5
  • 使单个函数适用于列表、字节字符串和文本(或许还有其他类似的表示形式)

    我正在编写一个函数 它可以在任意符号序列中进行一些搜索 我想让它足够通用 以便它可以在列表上运行 Foldable以及ByteStrings and Texts 将其概括为Foldable很简单 但如何包含ByteStrings and T
  • 等待 .NET 4.0 中的替代方案?

    NET 4 0 中await 关键字的最佳替代方案是什么 我有一个方法需要在异步操作后返回一个值 我注意到 wait 方法完全阻塞了线程 从而使异步操作变得无用 我可以选择哪些选项来运行异步操作 同时仍释放 UI 线程 我认为你的基本选择是
  • 为什么嵌套实例化中没有可用的 TypeTag(当由 scala 代码运行程序解释时)?

    我正在尝试改变的行为List toString根据其类型参数 自从List无法扩展 它由自定义类包装CList 可能是隐含的 但问题仍然是一样的 打印时出现问题CList of CLists 以下是示例和注释中的相应输出 object Fo
  • hibernate、mysql、glassfish v3 和 JTA 数据源

    我正在尝试将 hibernate 实体管理器与 mysql 和 glassfish 一起使用 尝试使用 JTA 数据源时出现以下错误 Caused by org hibernate HibernateException The chosen
  • Docker RUN ls 显示缓存文件

    我正在尝试设置一个 docker 容器并正在使用RUN ls帮助调试 然而 当我跑步时RUN ls docker 打印出以下内容 gt Using cache gt 96223b1b0748 我希望它注销文件夹中的文件 有谁知道会发生什么
  • 创建一个带有 Action 多个参数的任务

    我想在包含操作的任务中添加多个参数 我回顾了现有的堆栈溢出问题使用操作创建任务 请帮助我如何在任务的操作方法中传递多个参数 Action
  • 使滚动条在移动浏览器中可见

    当我有一个带有可滚动内容的网页时 使用CSS属性 overflow auto 或 overflow visible 滚动条在桌面浏览器上可见 但是当我在移动浏览器上打开页面时 滚动条仅在我尝试滚动时才会出现 有没有办法让滚动条在移动设备上始
  • Rails 中的 PG pg_ext 加载错误

    我最近更新到了 Rails 4 1 6 和 ruby 2 1 3p242 我还更新了系统上的所有宝石 创建新应用程序后 我在运行服务器时不断收到 pg ext 加载文件错误 我使用的是 Windows 8 x64 和 PostgreSQL
  • 在 JavaScript 中指定 eval() 的范围?

    有什么方法可以在特定范围内执行 eval 但不是全球性的 例如 以下代码不起作用 第二条语句中 a 未定义 因为它们位于不同的范围内 eval var a 1 eval alert a 如果可能的话 我想动态创建一个范围 例如 语法肯定是错
  • 我可以将变量从 Bash 脚本导出到环境中而不需要获取它吗?

    假设我有这个脚本 导出 bash usr bin env bash export VAR HELLO VARIABLE 当我执行脚本并尝试访问 VAR 我没有得到任何价值 echo VAR 有没有办法访问 VAR只需执行export bas
  • 获取通过“attr_accessor”定义的所有变量,而不覆盖“attr_accessor”

    我正在我的程序上设置一些跟踪代码 并且想知道哪些方法是通过定义的attr accessor Using TracePoint 我可以检测到什么时候attr accessor被调用 但我不知道如何让它告诉我它收到的参数 有任何想法吗 在问题标
  • 使用 python 将字典列表插入 SQL 表中

    我正在使用 python 和 sql 数据库迈出第一步 但仍然不确定要使用哪个包以及如何使用 我有一个包含大约 300k 个字典的列表 每个字典大约有 20 个键 这些字典应插入到 SQL 表中 在我看来 字典方法列表的优点是 我明确命名要
  • JUnit 测试未启动 Android 服务

    我有这个测试类来测试远程服务 public class CoreServiceBasicTest extends ServiceTestCase
  • RIA 服务与 WCF 服务

    我正在重写一个 LOB 应用程序 其架构如下 Silverlight Windows Mobile gt WCF gt 实体框架 gt 数据库 移动应用程序应该能够像 silverlight 应用程序一样执行某些操作 在这里使用 RIA 服
  • C++ 中向量是通过值还是通过引用传递给函数

    我正在用 C 编码 如果我有一些功能void foo vector