在 C++ 中创建数组而不提前知道长度

2023-12-04

我正在开发一个小程序,以帮助加快我的实验室工作的一些数据分析速度。它应该从文本文件中读取数据,创建一堆包含这些数据的数组,然后进行一些数学运算。

我一直遇到的问题是我不知道原始文本文件有多少行,所以我不知道要制作多大的数组。我对 C++ 很陌生,现在我对动态大小的数组感到不舒服,这里有一些代码

// first determine the length of the file
ifstream dataFile ("xys_data.txt");
const int LENGTH = count(istreambuf_iterator<char>(dataFile), istreambuf_iterator<char>(), '\n'); // counts the number of new lines

// declare vector of type datapoint
dataPoint data[LENGTH];

当我尝试编译这个时,我收到错误

expected constant expression
cannot allocate an array of constant size 0
'data' : unknown size

但我不是把 LENGTH 定义为常数吗?

任何帮助将不胜感激。

EDIT

按照几乎所有人的建议,我开始使用 std::vector。我还有最后一个问题,我对此有点犹豫不决。

在第一次尝试该程序时,我定义了一个数据结构:

struct dataPoint
{
  double x; // x values
  double y; // y values
  double s; // sigma values
};

然后,当我从文件中读取数据时,我将其发送到这个结构,如下所示

while (!dataFile.eof()) // this loop writes out each row of data to the arrays x, y, s until it reaches the end of the file
{ 
  int j = 0;
  dataFile >> data[j].x >> data[j].y >> data[j].s;
  j++;
}

有没有办法使用向量来做到这一点?我的第一个想法是定义向量 x、y 和 s 并替换data[j].x with x在循环中,但这不起作用。


首先也是最重要的,C++ 中的内置数组必须具有编译时大小。仅仅声明您的身份是不够的LENGTH多变的const。使其成为编译时常量也很重要。你的LENGTH不是编译时常量,因此声明一个大小的数组LENGTH不可能。这就是编译器试图告诉你的。

当您需要构建一个事先未知其大小的数组时,通常至少有三种方法可供选择:

  1. 两遍阅读。对数据源进行“试运行”以确定未来数组的确切大小。分配数组。第二次遍历数据源以用数据填充数组。

  2. 重新分配。使用可重新分配的数组。分配一个固定大小的数组并用数据填充它。如果数组太小,则将其重新分配到更大的大小并继续填充它。继续读取并重新分配,直到读取完所有数据。

  3. 转换。将数据读入廉价且易于扩展的数据结构(如链表),然后将其转换为数组。

这些方法中的每一种都有其自身的优点和缺点、局限性和适用范围。

在您的情况下,您似乎正在尝试使用第一种方法。当您处理文件时使用它并不是一个好主意。首先,对一个文件进行两次传递并不是很有效。其次,在一般情况下,它可能会产生竞争条件:文件可能会在两次传递之间发生变化。如果您仍然想这样做,只需使用std::vector而不是内置数组。

但是,对于您的情况,我建议使用第二种方法。再次,使用std::vector来存储您的数据。逐行读取数据并将其逐项附加到向量中。该向量将根据需要自动重新分配自身。

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

在 C++ 中创建数组而不提前知道长度 的相关文章

随机推荐

  • NSDateFormatter setDateFormat 的序号月日后缀选项

    我使用 NSDateFormatter 的什么 setDateFormat 选项来获取月份的序数后缀 例如下面的代码片段当前生成 8 月 15 日星期六下午 3 11 我必须改变什么才能得到 8 月 15 日星期六下午 3 11th NSD
  • jQuery animate() 元素的单个队列

    默认情况下 为 animate 创建的 jQuery 队列是按每个元素完成的 我想知道是否有一种方法可以为使用 animate 完成的所有动画创建单个队列 IE 一次只能发生一个动画 您可以使用队列在一个元素上使用自己的自定义队列来完成此操
  • R 中非标准日期因子的新列

    我有一个带有奇怪格式的日期列的数据框 我想创建一个列 仅显示原始日期列中的年份 但我很难想出一种方法来执行此操作 因为当前日期列被视为一个因素 任何有关如何有效地做到这一点的建议将不胜感激 Example从 开始 org lt c a b
  • Windows 通用应用程序 - 从 Azure 容器下载所有 Blob

    我有一个通用 Windows 应用程序 我试图在应用程序启动时从天蓝色容器下载所有 blob 这是我的代码 public MainPage this InitializeComponent downloadblobs public asyn
  • WinDbg:使用 .if 中的条件命令

    WinDbg 有 if 语句用于条件执行命令 if Condition Commands else Commands 对于条件 无法使用 WinDbg 命令 是否有任何间接方式使用条件命令 例如通过伪寄存器 要完成的示例任务 如果日志文件已
  • 如何使用 xml.etree.ElementTree 编写 XML 声明

    我正在使用 Python 生成 XML 文档ElementTree 但是tostring函数不包括XML声明当转换为明文时 from xml etree ElementTree import Element tostring documen
  • 从没有列名的查询中选择数据

    我在 VBA 中使用 SQL 来填充电子表格 但当我这样做时 我会获取包括列标题的数据 我试图找到只提取信息而不提取列名称的方法 例如 id name job 0 Tom Repair 1 Bob Tech 相反我想要 0 Tom Repa
  • pip install pygame - 找不到 SDL.h 文件

    macOS 塞拉利昂 fun python pip version pip 9 0 1 from Library Frameworks Python framework Versions 3 5 lib python3 5 site pac
  • 正则表达式中对 \K 的支持

    The K转义序列将匹配的开头重置为当前位置 令牌列表 这只影响报告为完全匹配的内容 支持哪些环境 语言 版本 K 保留 在其正则表达式引擎中 以及需要哪些库 如果有 才能在模式中使用此功能 The K多种引擎 语言或工具支持转义序列 例如
  • XSL:`xsl:template` 的 `match="/"` 的含义

    我刚刚学习 XML 以及如何使用 XSL 文件 在 XSL 文件中我发现了以下术语 xsl template match 这代表什么 我可以用什么来代替 我可以写吗table或任何其他 HTML 标签来代替 的价值match的属性
  • 什么情况下HTTP_REFERER会为空

    我知道有可能得到一个空的 HTTP REFERER 什么情况下会出现这种情况 如果我得到一个空的 是否总是意味着用户更改了它 获取空值与获取空值相同吗 在什么情况下我也会得到这个 当最终用户 在浏览器地址栏中输入站点 URL 通过浏览器维护
  • 在 C# 中序列化数组列表

    我有一个包含许多标准字段和一个数组列表的类 有没有办法使用 XmlSerializer 序列化该类 到目前为止的尝试会导致一条错误消息 Unhandled Exception System InvalidOperationException
  • 使用 .NET 反应式扩展定期调度 IEnumerable

    比如说我有一个可枚举的 dim e Enumerable Range 0 1024 我希望能够做到 dim o e ToObservable Timespan FromSeconds 1 这样可观察对象每秒都会生成值 直到枚举完毕 我想不出
  • PostgreSQL 中使用“类似”的查询性能

    我需要根据特定列中的某些值从表中检索某些行 名为columnX在示例中 select from tableName where columnX similar to A B C 1 2 3 So if columnX至少包含指定值之一 A
  • 可执行路径指向错误的位置,如何更新

    我最近使用 npm 更新了一个 nodejs 可执行文件 现在该可执行文件指向错误的位置 当我在终端中运行which命令时 它指向旧的不存在的位置 如何更新可执行路径或快捷方式 我不是一个 Unix 人 所以不确定它在哪里设置 我不一定需要
  • 在管理员接受其域的应用程序市场范围后,我们是否需要等待以避免同意屏幕?

    我们正在将我们的应用程序集成到新的 Google Marketplace 中 我们在开发者控制台中的市场配置没问题 我们的 oauth2 sso 流程正常 范围与控制台中的设置匹配 身份验证参数正常 所有用户在通过导航栏访问我们的应用程序时
  • 泛型方法中的原始类型转换,无需装箱

    在对我们的一个应用程序进行一些分析时 我发现了以下代码 public TOut GetValue
  • Kotlin readLine() 函数无法正常工作

    我最近在kotlin中做了一个简单的用户输入代码 我尝试在intellij Idea上运行它 但是它不能正常工作 当我运行代码时 出现 输入文本 部分 我可以输入一些单词 但是readLine 似乎不起作用 因为它没有继续到最后一个 pri
  • 为什么数据库查询在应用程序中只会变慢?

    我有一个网页 需要 10 分钟才能对数据库运行一个查询 但从 SQL Server Management Studio 运行时 相同的查询会在不到一秒的时间内返回 该网页只是向正在执行存储过程的数据库触发 SQL 而数据库又对四个表执行非常
  • 在 C++ 中创建数组而不提前知道长度

    我正在开发一个小程序 以帮助加快我的实验室工作的一些数据分析速度 它应该从文本文件中读取数据 创建一堆包含这些数据的数组 然后进行一些数学运算 我一直遇到的问题是我不知道原始文本文件有多少行 所以我不知道要制作多大的数组 我对 C 很陌生