【问题标题】:File istream iterator understanding文件istream迭代器理解
【发布时间】:2014-04-09 20:58:29
【问题描述】:

我可能对 istream_iterator 或一般的迭代器缺乏一些了解,但是这两个代码 sn-ps 不应该产生相同的结果吗?

typedef vector<int>::iterator Itv;
vector<int> vec = {1,2,3,4,5,6,7,8,9};

Itv ev = vec.begin();
++ev;
++ev;
++ev;
for (Itv it = vec.begin(); it != ev; ++it){
    cout << *it;
}

输出:123

//data.txt contains: 1,2,3,4,5,6,7,8,9
typedef istream_iterator<char> Itf;
fstream file("data.txt");
Itf ef(file);
++ef;
++ef;
++ef;    
for (Itf it(file); it != ef; ++it){
    cout << *it;
}

什么都不输出。

【问题讨论】:

  • Itf it(file) 与从流的开头开始不同。前一个迭代器读取将文件流位置向前移动。
  • 旁注:有一个函数std::advance 用于多次递增迭代器。

标签: c++ iterator istream-iterator


【解决方案1】:

输入流迭代器是单遍迭代器,这意味着一旦它们被递增,就无法获得其先前的值。当递增std::istream_iterator&lt;T&gt; 时,它会将一个值提取到T() 对象中并返回结果。因此,该值被丢弃并且无法重新获得。

您要做的就是将每个读取存储到一个向量中,然后将其打印出来。你也可以使用std::ostream_iterator:

std::ostream_iterator<char> out(std::cout);
Itf ef(file);

out = ++ef;
out = ++ef;
out = ++ef;

这也是等价的:

std::copy(ef, Itf(), out);

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2018-01-05
    • 2018-08-29
    • 2013-08-21
    • 2013-12-29
    • 2012-08-07
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多