3

我不明白通过迭代器读取字符串与直接读取字符串有何不同。为了举例说明,请考虑以下代码:

#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main() 
{
    string str{istream_iterator<char>(cin),{}};
    cout << str << endl;

    string str1;
    cin >> str1;
    cout << str1 << endl;
}

它的作用很明显,它str使用读取istream_iterator,并str1通过传统方法读取。我有两个问题:

  1. 通过字符串迭代器结束读取的唯一方法是发送一个CTRL+D(Unix),它也会终止程序,因此第二部分不会执行。有没有办法解决?
  2. 使用迭代器读取时,输入空格(空格、\t、\n)无关紧要,迭代器会继续读取。为什么这种行为与直接通过阅读时的行为不同cin >>
4

2 回答 2

3
  1. 如果您已到达流的末尾,则无法再阅读任何内容。

  2. 范围构造函数中提供的结束迭代器表示输入的结束。当遇到无效字符或流的结尾(EOF找到)时,开始迭代器将等于结束迭代器,这就是它停止的方式。流迭代器确实会丢弃空格,因此如果您打印字符串,它应该不包含空格。

    第二次提取格式化使用空格来分隔输入,这就是为什么只读取一个单词的原因。

于 2014-08-06T14:14:26.157 回答
3

我不明白通过迭代器读取字符串与直接读取字符串有何不同。

您的示例中的不同之处在于,第一个读取整个流,而第二个读取一个单词(直到第一个空格)。

更一般地说,迭代器可用于填充其他容器(例如使用istream_iterator<int>to fill vector<int>),或直接传递给使用前向迭代器的算法。

通过字符串迭代器结束读取的唯一方法是发送一个CTRL+D(Unix),它也会终止程序

它不会终止程序,它只是关闭输入流。但是这样做之后,您将无法从输入中读取任何其他内容;就目前而言,您的程序没有意义,因为它试图读取超出cin.

使用迭代器读取时,输入空格(空格、\t、\n)无关紧要,迭代器会继续读取。为什么这种行为与直接通过阅读时的行为不同cin >>

因为这>>就是定义为使用字符串的方式。

于 2014-08-06T14:16:09.030 回答