一种有争议的方法,可以将文件中的行读入矢量

时间:2015-05-12 12:59:15

标签: c++ stream iterator

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

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

工作得很整齐。我的问题是:

  1. 它是如何工作的? @ user470379通过将其扩展为while循环发布了“等效”代码段。我理解循环,但我没有看到等价。
  2. 为什么人们会批评?除了我在这里不关心的分隔符或引用问题之外,像@StudentT和@XanderTulip这样的人说这是非常低效的。由于我不知道它是如何工作的,我无法得到效率低下的部分。但我也不认为分隔符问题会导致性能问题,如@StudentT所述(“ ...因此无法扩展...... ”)。
  3. 谢谢。

3 个答案:

答案 0 :(得分:2)

  

它是如何运作的?

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

  

为什么人们批评?

该答案中的代码用于分割字符串,因此效率很低 - 有些方法可以在不先复制子字符串的情况下查看子字符串,然后分配大量的小字符串。你的代码是相当不同的 - 从文件中读取一组数字 - 这是一种相当有效的方法。

答案 1 :(得分:0)

对于第一个问题:

istream_iterator<double>{fs}是文件流开始的迭代器。

istream_iterator<double>{}是流末尾的迭代器。

使用上述[first,last]范围初始化vector。

答案 2 :(得分:0)

  

1.它如何工作? @ user470379发布了&#34;等效的&#34;将它扩展为while循环的代码片段。我理解循环,但我没有看到等价。

std :: istream_iterator将迭代器概念映射到输入流:它将迭代器递增的操作映射到读取操作(到绑定类型的变量)和取消引用迭代器操作以将此值提供给客户端代码

这有效地允许您将任何输入流视为可迭代序列(并且在STL中与通用迭代器一起使用的任何代码中挂钩)。

  

2.为什么人们批评?除了我在这里不关心的分隔符或引用问题之外,像@StudentT和@XanderTulip这样的人说这是非常低效的。

这不是低效的(不管是时间/内存复杂感)但它可能有点慢(我不知道是否是这种情况 - 测量并找出)。

与往常一样,以惯用的方式编写代码。如果效率低下,则必要时进行测量和优化。