c++ - 一种有争议的从文件中读取行到 vector 的方法

标签 c++ stream iterator

我正在使用来自 this answer 的代码从文件中读取数字行(每行一个数字)到 vector 中:

ifstream fs(file_name);
vector<double> v {istream_iterator<double>{fs}, istream_iterator<double>{}};
fs.close();

它工作得很好。我的问题是:

  1. 它是如何工作的? @user470379 通过将其扩展为 while 循环发布了一段“等效”代码。我理解这个循环,但我不明白其中的等价性。
  2. 人们为什么批评?除了我在这里不关心的定界符或引号问题外,@StudentT 和@XanderTulip 等一些人表示它非常低效。因为我不知道它是如何工作的,所以我无法得到低效的部分。但我也不认为分隔符问题会导致性能问题,如@StudentT 所述(“...因此不可扩展...”)。

谢谢。

最佳答案

How does it work?

它通过从一系列从流中读取的迭代器进行复制来初始化 vector 。给定流的初始迭代器每次递增时都会从流中读取一个double。当它到达末尾时,它比较等于用于标记范围末尾的默认构造的迭代器。

Why were people criticizing?

该答案中的代码用于拆分字符串,因此效率很低 - 有一些方法可以查看子字符串而无需首先复制它,然后分配大量小字符串。您的代码非常不同 - 从文件中读取一组数字 - 并且是一种相当有效的方法。

关于c++ - 一种有争议的从文件中读取行到 vector 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191639/

相关文章:

c++ - 如何将 std::unordered_multimap<uint, T> 转储到 std::vector<T>?

c++将派生类分配给基类的更好方法

c++ - 在 AVR 的程序内存中构建编译时任意长度数组

c++ - C++中的单例多线程代码

c++ - std::ios::openmode 的组合在文件存在时截断但阻止创建新文件?

c++ - 集合上的输出迭代器 : assign and increment iterator

rust - 检索scan()迭代器中的状态?

c++ - 使用 "for"打破 "break"循环被认为是有害的?

c++ - C++ 流中的无效输入

c++ - 将多个迭代器推进到同一字符串流