c++ 如何知道对从文件解析的数据使用std::array还是std::vector,以及如何提高分配性能?

ecr0jaav  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个输入文件,它有一行一行的3D矢量数据。我想读取这个矢量数据并将其存储在程序中。我想我有两个选择:
我可以计算行数,我可以创建一个固定的数组,或者我可以用push_back将我的“矢量数据”插入std::vector对象
我的问题是,哪一种方法是最快的完成这项任务?
如果还有其他方法,请解释一下。

cnh2zyt3

cnh2zyt31#

这其实不是速度的问题,而是输入的性质的问题,因为这才是合适的集合类型所依赖的。
如果你的输入文件有固定的行数,这个行数在编译时是已知的,并且所有这样的输入文件都将有相同的行数,那么你可以使用一个支持编译时已知大小的容器,比如std::array,如果文件提供了意外的行数,那么抛出一个异常或使用一些其他的错误处理机制。
如果此类型的所有此类输入文件的行数不同,则必须使用在运行时支持可变大小的容器(非编译时已知大小),例如std::vector。在这种情况下,如果您希望在增加容器底层缓冲区的容量时避免重新分配的不必要性能成本,然后可以考虑更改输入文件的格式,使其以描述数据行数开始(现在你基本上是给你的输入文件模式一个 header 部分来描述下面数据的性质)。然后,在阅读文件时,你可以读取header并使用它包含的值来调用reserve。当然,您还需要调整程序中写入这些文件的部分,以使头信息与数据保持同步。如果您使用这样的头并且不相信输入文件已正确写入,则可以使用(这实际上是一个合理的想法),你也不应该假设数据行的数量与头中报告的数量相匹配,并在适当的时候抛出异常或使用项目的错误信号方法。
除了由程序控制的分配性能之外,性能实际上并不在您的控制范围内-例如,磁盘性能在很大程度上取决于磁盘的类型、文件系统的类型以及操作系统阅读文件的行为。我相信您仍然可以调整标准输入流的底层缓冲区的缓冲区大小(参见std::basic_ios<CharT,Traits>::rdbuf),但是否能带来改进的本质可能最终取决于上述因素。但是,请看看std::ios_base::sync_with_stdio,看看它是否适合在您的程序中使用。

相关问题