rdbuf vs getline vs">>"

时间:2015-12-25 16:57:55

标签: c++ string file split string-parsing

我想从文本文件中加载一个地图(如果你能想出任何其他方式将地图加载到一个数组中,我会打开任何新的东西)。 在文本文件中写的是类似的东西,但在规模上有点大。

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. 在字符串流中一次读取整个文本文件,稍后通过rdbuf()将其转换为字符串,然后拆分字符串并将其放入数组中。
  2. 通过getline()按号码读取数字。
  3. 使用>>按号码读取数字操作者。
  4. 我的问题是,通过使用ram和速度,所提到的(或任何其他方式,如果可用的)方式更好。 注意:天气与否使用rdbuf()是一个好方法。我非常欣赏分割字符串的不同方法之间的良好比较,例如将文本拆分为与空白相关的单词。

1 个答案:

答案 0 :(得分:4)

  

其中1是边框,0表示空,2表示墙。现在我想阅读这个文本文件,但我不确定哪种方式最好。我的想法是:

您没有足够的数据通过您提到的任何方式对效果产生重大影响。换句话说,专注于程序的正确性和稳健性,然后返回并优化缓慢的部分。

  

在stringstream中一次读取整个文本文件,然后通过rdbuf()将其转换为字符串,然后拆分字符串并将其放入数组中。

用于输入数据的最佳方法是保持输入流的流动。这通常意味着每次交易读取大量数据,而不是小批量的小额交易。与输入流相比,内存搜索和处理要快得多。

我建议您在使用istream::read之前使用rdbuf。对于其中任何一个,我建议读入内存的 preallocated 区域,即数组或使用字符串,在构造时保留字符串中的大空间。您不希望重新分配std::string数据以减慢您的计划速度。

  

通过getline()按号码读取数字。

由于您的数据是面向行的,因此这可能是有益的。您读取一行并处理一行。然而,良好的技术开始,比下面的方法复杂一点,但比以前的方法简单。

  

使用>>按号码读取数字运营商。

IMO,这是你应该使用的技术。该技术简单易行;使您能够处理项目的其余部分。

更改数据格式

如果要更快地输入,可以更改数据的格式。二进制数据,不需要翻译的数据,是最快的读取格式。它绕过了文本格式到内部表示的翻译。二进制数据是内部表示。

二进制数据的一个警告是难以阅读和修改。

优化

  1. 唐'吨。专注于完成项目:正确而有力。
  2. 唐'吨。通常,您获得的时间会浪费在等待I / O或 用户。开发时间成本高,不必要的优化是浪费开发时间因此浪费金钱。
  3. 个人资料您的可执行文件。优化占用最多的部件 执行时间。
  4. 在更改代码之前减少要求/功能。
  5. 在更改代码之前优化设计或体系结构。
  6. 在更改代码之前更改编译器优化设置。
  7. 更改数据结构&对齐缓存优化。
  8. 如果您的程序受I / O限制,请优化I / O.
  9. 减少执行流程中的分支/跳转/更改。