我正在使用this answer中的代码从文件中读取数字行(每行一个数字)到向量中:
ifstream fs(file_name);
vector<double> v {istream_iterator<double>{fs}, istream_iterator<double>{}};
fs.close();
工作得很整齐。我的问题是:
while
循环发布了“等效”代码段。我理解循环,但我没有看到等价。谢谢。
答案 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这样的人说这是非常低效的。
这不是低效的(不管是时间/内存复杂感)但它可能有点慢(我不知道是否是这种情况 - 测量并找出)。
与往常一样,以惯用的方式编写代码。如果效率低下,则必要时进行测量和优化。