rdbuf与getline与">>"的区别

3
我希望能够从文本文件中加载地图(如果您有任何其他将地图加载到数组的方法,我很乐意尝试新的方法)。 在文本文件中写入的内容类似于以下内容,但规模更大。
6 6 10 (Nevermind what this number "10" is but the two other are the map size.)
1 1 1 1 1 1
1 0 2 0 0 1
1 0 0 0 2 1
1 2 2 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

1代表边界,0代表空,2代表墙壁。现在我想读取这个文本文件,但不确定哪种方法最好。

  1. 用stringstream一次性读取整个文本文件,然后通过rdbuf()将其转换为字符串,然后分割字符串并放入数组中。
  2. 使用getline()逐个读取数字。
  3. 使用>>运算符逐个读取数字。

我的问题是,在内存使用和速度方面,哪种方法更好(或其他可用的方法)。注:是否使用rdbuf()是一个好方法。我很感激对不同字符串分割方式进行良好比较的建议,例如根据空格拆分文本成单词。


你没有看过scanf吗?在C++程序中使用scanf()比使用cin更快吗? 。问题的答案对istream和scanf进行了比较。另外,你可以通过将std::ios_base::sync_with_stdio设置为false来关闭istream的同步,但是如果我没有记错,只有在输入很大时,istream才会变慢。但是不确定内存使用情况。 - Incomputable
你是否在互联网上搜索过类似于“stackoverflow c++ 读取文件矩阵”或“stackoverflow 读取文件数组”的重复内容? - Thomas Matthews
2
顺便提一下,有两个性能瓶颈:1)输入(从设备读取)和2)从文本表示转换为内部表示。除非您的数据是以千兆字节为单位的,否则建议不要进行优化,因为与用户的任何交互都会浪费通过优化获得的时间。 - Thomas Matthews
@Danny_ds 只有一点点!地图最多只有20 kbs。 - yukashima huksay
@ThomasMatthews 好的!是啊,其实我有一台好的CPU和SSD内存!我只是想学习!资源方面没有太多限制:) 但还是谢谢你的建议。 - yukashima huksay
显示剩余2条评论
1个回答

4
1 表示边界,0 表示空,2 表示墙。现在我想要读取这个文本文件,但不确定哪种方式最好。我心中有一个想法:
你所提到的方法都无法对性能产生显著影响,因此,请先专注于程序的正确性和健壮性,然后再回来优化那些运行缓慢的部分。
将整个文本文件一次性读入 stringstream,然后通过 rdbuf() 将其转换为字符串,然后拆分字符串并将其放入数组中。
输入数据的最佳方法是保持输入流连续。这通常意味着每个事务读取大块数据,而不是许多数量小的小事务。内存比输入流更快地搜索和处理。
我建议在使用 rdbuf 之前使用 istream::read。对于任何一种方法,我建议读入一个预分配的内存区域,即一个数组或者如果使用 string,则在构造时保留一个大的空间。您不希望 std::string 数据的重新分配减慢您的程序。
通过getline()逐个读取数字。
由于您的数据是面向行的,因此这可能会有利。 您读取一行并处理一行。 这是一个很好的起点技术,但比下面的技术复杂一些,但比以前的方法简单。
使用>>运算符逐个读取数字。
在我看来,这应该是您应该使用的技术。 该技术简单易行,易于工作,使您能够处理项目的其余部分。
更改数据格式
如果要加快输入速度,则可以更改数据格式。 二进制数据,即不需要转换的数据,是最快的格式。 它绕过了从文本格式到内部表示的翻译。 二进制数据是内部表示形式。
二进制数据的注意事项之一是它很难阅读和修改。
优化
  1. 不要优化。专注于正确而稳健地完成项目。
  2. 不要优化。通常情况下,你节省的时间会浪费在等待I/O或用户上。开发时间很宝贵,不必要的优化只会浪费开发时间,从而浪费金钱。
  3. 对可执行文件进行性能分析。优化占用大部分执行时间的部分。
  4. 在修改代码之前减少需求/功能。
  5. 在修改代码之前优化设计或架构。
  6. 在修改代码之前更改编译器优化设置。
  7. 为缓存优化更改数据结构和对齐方式。
  8. 如果程序受I/O限制,请优化I/O。
  9. 减少分支/跳转/执行流程中的更改。

特别是,该程序听起来像是一个迷宫跟随程序。如果输入数据很小,IO将无关紧要。如果输入数据很大,IO将成为整个执行时间中微不足道的一部分。首先用最简单的方法(即 >>),只有在必要时才考虑优化。 - Martin Bonner supports Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接