繁体   English   中英

std :: istream_iterator停止前进

[英]std::istream_iterator stops advancing

为什么以下程序输出

1 2 3 4 4 4

并不是

1 2 3 4 5 6

提供的每个值?

#include <iostream>
#include <iterator>
#include <vector>
#include <string>
#include <sstream>

int main()
{

    std::vector<int> numbers;
    std::stringstream ss;
    ss << " 1 2";
    std::istream_iterator<int> start{ss},end;
    ss << " 3 4";
    numbers.push_back(*start++);
    numbers.push_back(*start++);
    numbers.push_back(*start++);
    ss << " 5 6";
    numbers.push_back(*start++);
    numbers.push_back(*start++);
    numbers.push_back(*start++);

    std::cout << "numbers read in:\n";
    for (auto number : numbers) {
        std::cout << number << " ";
    }
    std::cout << "\n";
}

它不是您可能想到的迭代器。 迭代器进行之后,ss无效。 初始stringstream包含1 2 3 4并处于有效状态。 但是由于第三个迭代器取消引用而无效,因此下一个操作ss << " 5 6"失败。 要解决此问题,请清除stringstream变量的标志:

//...
ss.clear();
ss << " 5 6";
//...

输出:

numbers read in:
1 2 3 4 5 6

请谨慎使用流迭代器。 当有效的istream_iterator到达基础流的末尾时,它等于流末迭代器。

然后,取消引用或递增它会进一步调用未定义的行为,在您的情况下,您只是获得了最近读取的对象的副本。

还请记住,构造迭代器时会读取流中的第一个对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM