C++计算标准输入的字数

问题描述 投票:0回答:1

我看到一段C++代码,用来统计标准输入的字数。

#include <iostream>
#include <iterator>
#include <string>
using namespace std;

int main() {
    auto ss {
        istream_iterator<string>{cin}
    };
    cout << distance(ss, {}) << endl;

    return 0;
}

我有几个问题

  1. 什么类型的 auto ss?
  2. 什么是 distance(ss, {}) 做什么?它为什么要计算字数?

我猜测是:

  1. istream_iterator<string>{cin} 把标准输入转换成 istream_iterator 类型,自动用空格分隔(为什么?因此 ss 看起来 container 与所有单词作为其元素。
  2. distance(ss, {}) 计算第1个元素和空元素(因此在最后一个元素之外,但为什么?)之间的距离。

谁能帮我去猜测一下这段奇妙的短代码?

c++ distance istream-iterator
1个回答
3
投票

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

1
投票
  1. ss has type std::istream_iterator<std::string>.
  2. 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的内容切割其实是在计算距离的时候偷懒完成的。

这确实是一段有趣的代码。

© www.soinside.com 2019 - 2024. All rights reserved.