istream_iterator: дополнительная информация - PullRequest
3 голосов
/ 11 ноября 2010

Я не могу заставить эту проклятую вещь работать правильно. Проблема в том, что если я хочу ввести 2 числа, мне нужно ввести 3. Что не так?

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

Ответы [ 3 ]

3 голосов
/ 11 ноября 2010

Измените ваш цикл итератора потока на:

    for(size_t szI = 0; (szI < szCount); ++szI)
    {   
        *oitBegin = *iitBegin;
        if (szI < szCount - 1)
        {
          ++oitBegin;
          ++iitBegin;
        }
    }   
2 голосов
/ 11 ноября 2010

Проблема в том, что 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 голосов
/ 11 ноября 2010

Я думаю, проблема в том, что вы не передаете символ EOF.Если вы работаете в Linux, попробуйте ввести CTRL + D после вставки второго числа (в Windows должно быть CTRL + Z, но я не уверен).

...