代码之家  ›  专栏  ›  技术社区  ›  phwd

使用IStream_迭代器迭代int和string

c++
  •  3
  • phwd  · 技术社区  · 14 年前

    我正在浏览C++编程语言的书并达到“迭代器和I/O”第61页,他们给出了下面的例子来演示迭代提交的字符串。

    #include <iostream>
    #include <iterator>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        istream_iterator<string>ii(cin);
        istream_iterator<string>eos;
    
        string s1 = *ii;
        ++ii;
        string s2 = *ii;
    
        cout <<s1 << ' '<< s2 <<'\n';
    }
    

    我完全理解,现在我在玩这个例子,让它也适用于数字。我试着在各自的地方添加以下内容…

    istream_iterator<int>jj(cin);
    int i1 = *jj;
    cout <<s1 << ''<< s2 << ''<< i1 <<'\n';
    

    在运行程序时,它不能给我输入数字部分的机会。为什么会这样?迭代器只能在上使用一次 cin ?这样它就已经从 CIN 所以忽略下一个迭代器?


    这里是插入后的内容

    #include <iostream>
    #include <iterator>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        istream_iterator<string>ii(cin);
        istream_iterator<string>eos;
    
        //istream_iterator<int>dd(cin);
    
        string s1 = *ii;
        ++ii;
        string s2 = *ii;
        //int d = *dd;
        int d =24;
        cout <<s1 << ' '<<s2<<' '<<d<< '\n';
    }
    

    上述工程用于

    你好,世界
    你好
    世界

    以“你好世界”为输出。

    正在从中删除注释

    istream_iterator<int>dd(cin);
    int d = *dd;
    

    并发表评论

    int d =24;
    

    将hello hello 0作为输出。

    1 回复  |  直到 14 年前
        1
  •  6
  •   Benjamin Lindley    14 年前

    当您第一次创建IStream_迭代器时,它会得到第一个输入并在内部存储数据。为了获得更多的数据,您可以调用operator++。下面是代码中发生的事情:

    int main()
    {
    
        istream_iterator<string>ii(cin);  // gets the first string "Hello"
        istream_iterator<int>jj(cin); // tries to get an int, but fails and puts cin in an error state
    
        string s1 = *ii; // stores "Hello" in s1
        ++ii;            // Tries to get the next string, but can't because cin is in an error state
        string s2 = *ii; // stores "Hello" in s2
        int i1 = *jj;    // since the previous attempt to get an int failed, this gets the default value, which is 0
    
        cout <<s1 << ' '<<s2 <<' '<< i1 << '\n';
    }
    

    以下是您想要做的:

    int main()
    {
    
        istream_iterator<string>ii(cin);
    
        string s1 = *ii;
        ++ii;
        string s2 = *ii;
    
        istream_iterator<int>jj(cin);
        int i1 = *jj;
    
        // after this, you can use the iterators alternatingly,
        //  calling operator++ to get the next input each time
    
        cout <<s1 << ' '<<s2 <<' '<< i1 << '\n';
    }