我看到一段C++代码,用来统计标准输入的字数。
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
int main() {
auto ss {
istream_iterator<string>{cin}
};
cout << distance(ss, {}) << endl;
return 0;
}
我有几个问题
auto ss
?distance(ss, {})
做什么?它为什么要计算字数?我猜测是:
istream_iterator<string>{cin}
把标准输入转换成 istream_iterator
类型,自动用空格分隔(为什么?因此 ss
看起来 container
与所有单词作为其元素。distance(ss, {})
计算第1个元素和空元素(因此在最后一个元素之外,但为什么?)之间的距离。谁能帮我去猜测一下这段奇妙的短代码?
auto ss
推导出 ss
将要 std::istream_iterator<std::string>
,因为这就是完整的语句正在构造和分配给 ss
.
istream_iterator
使用指定的 istream
's operator>>
读取指定类型的格式化输入,其中的 operator>>
读取以空格分隔的输入,包括空格字符和换行符等。 所以,在这种情况下 istream_iterator<string>
正在阅读 std::string
价值来自 std::cin
每次只输入一个以空格分隔的单词。
istream_iterator
是一个输入迭代器,以及一个默认构造的 istream_iterator
指的是 末流 迭代器。 当 istream_iterator
停止读取(达到 EOF、输入错误等),其值等于 末流 迭代器。
std::distance()
返回一对迭代器所表示的范围内的元素数。 对于一个非随机输入的迭代器,如 istream_iterator
, std::distance()
每次通过迭代器的 operator++
,计算它增量迭代器的次数,直到到达目标迭代器。所以,在这种情况下。istream_iterator::operator++
内部从其 istream
因此 std::distance()
有效地返回从 std::cin
直到 末流 是达到了。
所以,你所展示的代码大致只是一种算法,写出下面的等价循环。
int main() {
string s;
size_t count = 0;
while (cin >> s) {
++count;
}
cout << count << endl;
return 0;
}
ss
has type std::istream_iterator<std::string>
.std::distance(ss, {})
计算从 std::cin 中第一个以空格分隔的标记到 cin 的结尾之间的项数,有效地返回 std::cin 中以空格分隔的标记的数量。 这是由于 std::istream::operator>>(std::istream&, std::string&)
函数(第二个参数实际上不是一个 std::string
但我想让这段话简短一些)。) 的默认构造函数。std::istream_iterator<std::string>
返回任何 std::istream_iterator<std::string>
. std::cin的内容切割其实是在计算距离的时候偷懒完成的。
这确实是一段有趣的代码。