C++ std::istream_迭代器停止前进

C++ std::istream_迭代器停止前进,c++,c++11,C++,C++11,为什么下面的程序会输出 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 s

为什么下面的程序会输出

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";
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::向量数;
std::stringstream-ss;

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

然后取消引用或增加它会进一步调用未定义的行为,在您的例子中,您只得到了最近读取的对象的副本


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

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

然后取消引用或增加它会进一步调用未定义的行为,在您的例子中,您只得到了最近读取的对象的副本


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

迭代器并不像您所想的那样工作。是ss在迭代器运行后无效。Initialiy stringstream包含
1 2 3 4
并处于有效状态。但第三个迭代器取消引用会使其无效,因此next操作
ss它不是迭代器按照您可能认为的那样执行的。是ss在迭代器进行之后无效。初始stringstream包含
1 2 3 4
并且处于有效状态。但是由于第三个迭代器取消引用而无效,因此下一个操作
ss
//...
ss.clear();
ss << " 5 6";
//...
numbers read in:
1 2 3 4 5 6