现实世界中的 C++ std::vector 与数组

2023-12-06

我是 C++ 新手。我正在阅读 Michael Dawson 的《通过游戏编程开始 C++》。不过,总的来说,我对编程并不陌生。我刚刚完成了关于向量的一章,所以我有一个关于它们在现实世界中的使用的问题(我是一名计算机科学专业的学生,​​所以我还没有太多的现实世界经验)。

作者在每章末尾都有一个 Q/A,其中一个是:

问:什么时候应该使用向量而不是数组?

答:几乎总是如此。向量高效且灵活。它们确实需要比数组多一点的内存,但这种权衡几乎总是值得的。

你们有什么感想?我记得在一本 Java 书中学习过向量,但我们在我的 Intro to Comp 中根本没有涉及它们。科学。课,也不是我大学的数据结构课。我也从未见过它们在任何编程作业(Java 和 C)中使用。这让我觉得它们并没有被经常使用,尽管我知道学校代码和现实世界的代码可能非常不同。

我不需要被告知这两种数据结构之间的差异;我非常了解他们。我想知道的是作者是否在他的问答中给出了好的建议,或者他是否只是想避免初学者程序员因管理固定大小数据结构的复杂性而毁掉自己。另外,无论您如何看待作者的建议,您认为如何?see在现实世界中更频繁?


答:几乎总是[使用向量而不是数组]。向量高效且灵活。它们确实需要比数组多一点的内存,但这种权衡几乎总是值得的。

这过于简单化了。使用数组相当常见,并且在以下情况下很有吸引力:

  • 这些元素是在编译时指定的,例如const char project[] = "Super Server";, const Colours colours[] = { Green, Yellow };

    • with C++11 it will be equally concise to initialise std::vectors with values
  • 元素的数量本质上是固定的,例如const char* const bool_to_str[] = { "false", "true" };, Piece chess_board[8][8];

  • 首次使用性能至关重要:使用常量数组,编译器通常可以将完全预初始化对象的内存快照写入可执行映像,然后将其直接页错误到准备使用的位置,因此通常要快得多运行时堆分配(new[]) 然后是对象的序列化构造

    • 编译器生成的表const数据始终可以被多个线程安全地读取,而在运行时构造的数据必须在非函数本地构造函数触发其他代码之前完成构造static变量尝试使用该数据:您最终需要某种方式的单例(可能是线程安全的,这会更慢)

    • 在 C++03 中,vector使用初始大小创建的 s 将构造一个原型元素对象,然后复制构造每个数据成员。这意味着,即使对于故意将构造保留为无操作的类型,复制数据元素仍然存在成本 - 复制它们在内存中留下的任何垃圾值。显然,未初始化元素的数组速度更快。

  • C++ 的强大功能之一是您通常可以编写一个class (or struct),它精确地模拟了特定协议所需的内存布局,然后将类指针指向您需要使用的内存,以方便地解释或分配值。无论好坏,许多此类协议通常嵌入小型固定大小的数组。

  • 有一个几十年前的黑客方法,将一个包含 1 个元素的数组(如果编译器允许它作为扩展,甚至是 0 个元素)放在结构/类的末尾,将指向结构类型的指针指向某个更大的数据区域,并访问基于内存可用性和内容的先验知识,数组元素离开结构的末尾(如果在写入之前读取) - 请参阅零元素数组需要什么?

  • 包含数组的类/结构仍然可以是 POD 类型

  • 数组有助于从多个进程访问共享内存(默认情况下vector指向实际动态分配数据的内部指针不会位于共享内存中,也不会跨进程有意义,并且众所周知,强制 C++03 很困难vector即使指定自定义分配器模板参数,也可以像这样使用共享内存)。

  • 嵌入数组可以本地化内存访问需求,提高缓存命中率,从而提高性能

也就是说,如果使用vector(在代码简洁性、可读性或性能方面)那么你最好这样做:他们已经size(),通过检查随机访问at()、迭代器、调整大小(随着应用程序“成熟”,这通常变得必要)等。从vector如果需要,可以更安全/更轻松地应用标准算法(x.end()x + sizeof x / sizeof x[0]任何一天)。

更新:C++11 引入了std::array<>,这避免了一些成本vectors - 内部使用固定大小的数组来避免额外的堆分配/释放 - 同时提供一些好处和 API 功能:http://en.cppreference.com/w/cpp/container/array.

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

现实世界中的 C++ std::vector 与数组 的相关文章

  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 从数组中删除空字符串,同时保持记录而不循环?

    这个问题在这里被问到 从数组中删除空字符串 同时保留非空字符串的索引记录 https stackoverflow com questions 18113243 remove empty strings from array while ke
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 如何在不单击按钮的情况下在颤振中显示警报对话框

    当存在特定错误状态接收且列表数据不为空时 我找不到在列内显示对话框警报的方法 警报对话框不涉及任何按钮单击 并且所有在线示例都包含 onTap 按钮 我想在列表数据不为空并且设置了错误标志时显示警报 下面是我的代码 override Wid
  • 使用 html 和 Javascript 进行客户端排序

    如何制作一个 html 表 用户可以使用列标题在客户端进行排序 我可以将所有行的 html 数据加载到 Javascript 数组中 并使用 dom 将表格添加到内容 div 但这是正确的方法吗 如果您列出主要方法 我可以从那里找到我的方法
  • 在Python中读取图例的高度

    我有一些包含大量信息和线条的图 所以有时我倾向于将图例放在图本身之外using bbox to anchor 我也更喜欢有一个情节标题 但在这种情况下 这将在位置上与图例重合 下面的示例只是对问题的说明 import numpy as np
  • 非平凡数据类型的预定义常量

    我的目标 为具有 ID 和消息的预定义错误创建一个 C 类 这是我尝试过的 public class MyError public static readonly MyError OK new MyError 0 OK public sta
  • Oracle JDBC DriverManager.getConnection() 挂起

    我们有几台服务器 每台服务器都运行 Oracle 数据库 11g 版本 11 2 0 1 0 64 位 我们通过 JDBC 进行连接 如下所示 public Connection createConnection String drvCla
  • VS2010 和 VS2012“脚本文档”部分永远不会出现,并且我无法调试 JavaScript

    Tools Windows 7的 Visual Studio 2010 和 2012 浏览器9 ASP NET 4 0 MVC4 直到几天前 我还可以使用解决方案资源管理器中的脚本文档部分进行调试 现在 当开始调试 F5 时 不会出现脚本文
  • Apache 在 htaccess 中重定向到子目录

    我已经构建了一个内部应用程序 需要在公共文件夹中启动 目录结构如下 myapp conf myapp tmp myapp doc myapp public myapp public css myapp public js myapp pub
  • 无法访问 .net 标准中的 httpcontext 扩展方法

    我有这个 NET 标准库 我想在其中编写 NET Core 中间件 我想要在其中执行以下操作 Endpoint endpoint httpContext GetEndpoint The GetEndpoint 扩展方法无法解析 我已经参考过
  • 如何让多个fetch函数按顺序执行?

    我创建了一个 IG Like 按钮 点击后点赞数会发生变化 我添加了 2 个获取函数 一个带有 PUT 我尝试了多种方法 但结果是相同的 GET 获取首先被执行 我怎样才能防止这种情况发生 function liking tweetid l
  • 重新启动 Activity 时调用 onStop 延迟

    重新启动 Activity 时 onStop 由于之前的活动延迟太多而无法调用 我正在使用此代码重新启动我的活动PlayerActivity java Intent playerIntent getIntent playerIntent p
  • 想要在 Android 中显示来自 RSSFeed 的印度地方语言(泰卢固语、印地语、泰米尔语和马拉雅拉姆语)数据? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在开发报纸应用程序 我想从 RSSfeed 获取数据 并且想使用区域语言以 List
  • AngularJS:在没有工厂、服务或广播的情况下将数据从控制器传递到控制器?

    我不想使用服务或工厂 并且想传递例如数据数组 我想从子组件访问父控制器中的数据 工厂和服务被排除在外 因为我最终想将我的应用程序迁移到 Angular 2 并且我不想使用 ngclick 它似乎与广播 向上 打开密不可分 如果有人知道如何使
  • 更新到 jQuery 1.9.1 后 browser.msie 错误

    我使用以下脚本片段 if browser msie browser version lt 9 extra Math floor Math random 3000 它可以很好地与jQuery 1 8 3 现在我将 jQuery 更新到了新版本
  • 我如何在反应本机中以编程方式发送短信? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我是反应原生的新手 我想在我的 Android 应用程序中添加一个用于发送短信的组件 并且我尝试了几种不同的组件 但每次我都会遇到一些错误 这里有人成功完成此操作吗 请帮我 这是我遇到
  • 将行号添加到文件[重复]

    这个问题在这里已经有答案了 我需要将行号写入 python 3 中已有的文本文件 他们要求文本文件的前 5 列包含 4 位行号 后跟一个空格 我尝试通过创建一个 for 循环来读取行并将数字 1 添加到行的开头 然后增加下一行的数字 但一直
  • .pointsToMatrix(p1) 中的错误:纬度 > 90

    我正在尝试使用 R 中的 geosphere 包中的 distVincentyEllipsoid 函数来计算数据框中不同点之间的距离 遵循以下给出的示例根据纬度 经度向量计算行驶的总英里数 但是 我不断收到错误 pointsToMatrix
  • 使用 PHP 代码示例时,“webViewLink”为空/null

    使用 Google 最新版本的 PHP api 0 60 代码示例来自谷歌开发者页面似乎可以工作 除了在函数末尾使用 print r createdFile 时 webViewLink 字段为空 空之外 我的 Google Apps 域的d
  • 使用 PHP 代码的 Sharepoint 网站

    我意识到 Sharepoint 基于 asp net 但我有一个 PHP 应用程序 用户希望我将其包含在 Sharepoint 站点中 那么可以在sharepoint中使用PHP代码吗 danit 当您在网站中说 包含 时 这是否意味着成为
  • 理解“||” Ruby 中 If 条件中的 OR 运算符

    简而言之 为什么以下三行的效果不相同 if controller controller name projects controller controller name parts if controller controller name
  • 现实世界中的 C++ std::vector 与数组

    我是 C 新手 我正在阅读 Michael Dawson 的 通过游戏编程开始 C 不过 总的来说 我对编程并不陌生 我刚刚完成了关于向量的一章 所以我有一个关于它们在现实世界中的使用的问题 我是一名计算机科学专业的学生 所以我还没有太多的