3

我不能让这该死的东西正常工作。问题是,如果我要输入 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;
}
4

3 回答 3

3

将您的流迭代器循环更改为:

    for(size_t szI = 0; (szI < szCount); ++szI)
    {   
        *oitBegin = *iitBegin;
        if (szI < szCount - 1)
        {
          ++oitBegin;
          ++iitBegin;
        }
    }   
于 2010-11-11T18:07:13.240 回答
2

问题是它istream_iterator不是在取消引用时读取,而是在递增时读取:

  • istream_iterator构造时读取第一个值
  • 当迭代器递增时,copy_n 读取 iNumCount 附加值

换句话说,您有太多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;
}
于 2010-11-11T18:03:56.933 回答
0

我认为问题在于您没有传递 EOF 符号。如果您在 Linux 下工作,请尝试在插入第二个数字后键入 CTRL+D(在 Windows 下应该是 CTRL+Z,但我不确定)。

于 2010-11-11T17:42:13.223 回答