2016-04-01 28 views
0

爲什麼下面的程序輸出的std :: istream_iterator停止前進

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"; 
} 

回答

2

它不是迭代器,你可能會想到。它是迭代器進展後失效的ss。初始串流持續1 2 3 4並處於有效狀態。但是被第三個迭代器取消引用無效,所以下一個操作ss << " 5 6"失敗。爲了解決這個問題,字符串流變量的明確標誌:

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

輸出:

numbers read in: 
1 2 3 4 5 6 
1

請謹慎使用流迭代器。當有效的istream_iterator到達基礎流的末尾時,它將變成流末尾迭代器的結果。

然後解引用或遞增它進一步調用未定義的行爲,在你的情況下,你只是得到最近讀取的對象的副本。

還要記住,當構造迭代器時,將從流中讀取第一個對象。