将文件读入d中的行数组

Mar*_*llo 5 arrays file-io d

将文本文件读入行数组的正确方法是什么?我在Rosetta Stone上找到了以下内容:

string[] readLines(string filename) {
  auto f = File(filename);
  scope(exit) f.close();
  string[] lines;

  foreach (str; f.byLine) {
    lines ~= str.idup;
  }

  return lines;
}
Run Code Online (Sandbox Code Playgroud)

但它看起来像每行调整一个数组,这是非常低效的.我可以通过标准的双倍方法跟踪读入的行数并调整数组的大小

  int i = 0;
  foreach (str; f.byLine) {
    if (lines.length <= i + 1) {
      lines.length = lines.length * 2 + 1;
    }
    lines[i] = str.idup;
    i++;
  }
  lines.length = i;
Run Code Online (Sandbox Code Playgroud)

但这是足够的样板代码,我不得不想知道我是不是只是忽略标准库中已经为我做这件事的东西.


编辑:给予fwend的注释更多可见性:本文详细描述了数组分配器的工作原理,以及运行时有效处理追加的原因

ric*_*t1k 4

实际上,每当数组空间不足时,D 都会将数组的保留空间加倍,因此您不需要手动执行此操作。这里有很多关于D数组的信息

  • dlang 上还有另一篇关于切片的文章很有趣。它有一个关于分配的部分。http://dlang.org/d-array-article.html (4认同)