2010-11-11 28 views
3

我不能得到這個爆炸的東西正常工作。問題是,如果我想輸入2個數字,我實際上必須輸入3.什麼是錯誤的?istream_iterator:採取額外的輸入

namespace MT 
{ 
    template<class IIT, class OIT> 
    OIT copy_n(IIT iitBegin, size_t szCount, OIT oitBegin) 
    { 
     for(size_t szI = 0; (szI < szCount); ++szI) 
     { 
      *oitBegin++ = *iitBegin++; 
     } 

     return oitBegin; 
    } 
}; 

int main() 
{ 
    vector<int> vNumbers; 
    vector<char> vOperators; 
    int iNumCount = 0; 
    int iNumOperators = 0; 

    cout << "Enter number of number(s) :) :\n"; 
    cin >> iNumCount; 
    cout << "Enter number of operator(s) :\n"; 
    cin >> iNumOperators; 

    int iNumber; 
    cout << "Enter the " << iNumCount << " number(s):\n"; 
    MT::copy_n(istream_iterator<int>(cin), iNumCount, back_inserter(vNumbers)); 

    char cOperator; 
    cout << "\nEnter the " << iNumOperators << " operator(s):\n"; 
    MT::copy_n(istream_iterator<char>(cin), iNumOperators, back_inserter(vOperators)); 

    copy(vNumbers.begin(), vNumbers.end(), ostream_iterator<int>(cout, " ")); 
    cout << endl; 
    copy(vOperators.begin(), vOperators.end(), ostream_iterator<char>(cout, " ")); 
    cout << endl; 

    return 0; 
} 
+0

無關的(可能)的問題:你的第二個istream_iterator 應該是istream_iterator 。與第二個ostream_iterator 相同。那些正在關閉矢量。 – luke 2010-11-11 17:30:34

+0

@luke:是的,已編輯。問題依舊。 – nakiya 2010-11-11 17:31:38

+0

你有幾條流提取線:'cin >> iNumCount'和'cin >> iNumOperators'。當你說「你想輸入2」時,你認爲你需要輸入3個數值,那麼我認爲你不計算它們? – wilhelmtell 2010-11-11 17:50:41

回答

3

您的流迭代循環更改爲:

for(size_t szI = 0; (szI < szCount); ++szI) 
    { 
     *oitBegin = *iitBegin; 
     if (szI < szCount - 1) 
     { 
      ++oitBegin; 
      ++iitBegin; 
     } 
    } 
+0

這工作。 'copy'將輸出迭代器返回到插入的最後一個元素。所以我認爲這是預期的行爲。 – nakiya 2010-11-11 18:20:38

0

我認爲問題是你沒有通過EOF符號。如果你在Linux下工作,嘗試在插入第二個數字後鍵入CTRL + D(在Windows下應該是CTRL + Z,但我不確定)。

+1

'copy_n()'應該假定至少有'n'個元素的有效範圍。它應該在遍歷'n'元素後停止。該算法不應達到最終位置。 – wilhelmtell 2010-11-11 17:47:58

+0

你是對的:) – Simone 2010-11-12 07:34:03

2

的問題是,當它的解除引用istream_iterator讀取,而是當它遞增:當istream_iterator被構造

  • iNumCount額外值由copy_n閱讀時的迭代器是

    • 第一值被讀出遞增

    換句話說,你有一個太多iiBegin++讀取被丟棄的值。在任何經典的迭代器中,這個最後一個增量會讓你'超過結束',但是在這裏它會觸發標準輸入的不必要讀取(顯然沒有結束)。

    [編輯]可能的解決辦法:

    template<class IIT, class OIT> 
    OIT copy_n(IIT iitBegin, size_t szCount, OIT oitBegin) 
    { 
        *oitBegin++ = *iitBegin; 
        for(size_t szI = 0; (szI < szCount - 1); ++szI) 
        *oitBegin++ = *++iitBegin; 
        return oitBegin; 
    } 
    
  • +0

    好的。那麼,如何保持'copy_n'的通用性,並使用'istream_iterator'並使其表現得像預期的那樣? – nakiya 2010-11-11 18:12:01