2016-11-18 67 views
2

太多我從標準輸入下列輸入:istream_iterator消耗從流

2 
5 
2 1 5 3 4 
5 
2 5 1 3 4 

第一行代表隊列數(我們稱之爲價值n)。然後,對於每個隊列,在第一行中有一個值l,表示隊列的長度,後面是實際的隊列。

我試圖用istream_iterator如下把隊列中的向量:

using namespace std; 
int n{}; 
int l{}; 
typedef std::istream_iterator<int> input_iterator; 
cin >> n; 
cout<< "n: " << n << "\n"; 
for(int i = 0; i < n ; ++i){ 

    cin >> l; 
    cout << "l: " << l << "\n"; 
    std::vector<int> queue; 
    int counter = 0; 
    for (input_iterator it(cin); counter < l && it != input_iterator(); ++it){ 
     queue.push_back((*it)); 
     ++counter; 
    } 
    cout<< "Queue: "; 
    std::copy(queue.begin(), queue.end(), 
        std::ostream_iterator<int>(std::cout, " ")); 
    cout << "\n"; 
} 

此代碼產生以下輸出:

n: 2 
l: 5 
Queue: 2 1 5 3 4 
l: 2 
Queue: 5 1 

正如你所看到的第一個隊列中讀取正確。但第二個l應該是5,而不是2

發生了什麼事5?它是否被迭代器使用?我在哪裏犯了一個錯誤?

+0

在調試器中逐行執行代碼。並停止陰影變量,在內部循環中爲迭代器使用另一個名稱。另外,是否有你想使用輸入迭代器的原因,而不僅僅是一個簡單的循環,你可以使用簡單的'std :: cin >> ...'來獲取值? –

+0

這和整個陰影事實上是寫這個例子發生的錯誤。我修正了這一點 – user2393256

回答

2

您的問題是您的for-loop離開隊列的最後一個元素旁邊的位置i。所以當撥打operator>>獲取l的下一個值時,你就是一個「閱讀步驟」太過分了。

爲了避免這個問題,你可以使用你所有的讀操作相同的迭代器 - 並將其重命名,以避免名稱衝突與外循環的變量i,就像這樣:

using namespace std; 
int n{}; 
int l{}; 
typedef std::istream_iterator<int> input_iterator; 
cin >> n; 
cout<< "n: " << n << "\n"; 
input_iterator it(cin); 
for(int i = 0; i < n ; ++i){ 

    l = *(it++); 
    cout << "l: " << l << "\n"; 
    std::vector<int> queue; 
    int counter = 0; 
    while(counter < l && it != input_iterator()){ 
     queue.push_back(*(it++)); 
     ++counter; 
    } 
    cout<< "Queue: "; 
    std::copy(queue.begin(), queue.end(), 
        std::ostream_iterator<int>(std::cout, " ")); 
    cout << "\n"; 
} 
2

IANALL,但istream_iterator據我所知允許在其operator++()中預讀。由於您正在爲讀取的每個組(數組的行)重新創建一個istream迭代器,因此您將放棄已經從輸入流中讀取下一個整數的迭代器。

一個解決方案是在for循環之外創建輸入迭代器一次,然後在整個循環中使用它。

2

一個for循環基本上只是一個花式的while循環。

讓我們這個for循環從您的代碼:

for (input_iterator it(cin); counter < l && it != input_iterator(); ++i){ 
    queue.push_back((*it)); 
    ++counter; 
} 

它等效於以下內容:

{ 
    input_iterator it(cin); 
    while (counter < l && it != input_iterator()) 
    { 
     queue.push_back((*it)); 
     ++counter; 
     ++it; 
    } 
} 

注意,在循環最後一行時,++it;說法? 這就是是什麼導致你的問題。它會增加一次太多的迭代器,所以迭代器在循環之後讀取輸入中的5。循環之後的下一個輸入操作將讀取下一行中的2

一個解決方案是保持迭代器,並在外部循環中重用它。也許使用它爲全部輸入。

另一種解決方案,這是我暗示關於我的評論,是有從零到lfor僅環而不是在所有使用迭代器,但只有純cin >> ...