这个程序是如何工作的

How does this program work

本文关键字:工作 何工作 程序      更新时间:2023-10-16

这是我的第一个c++程序。它输出输入的单词数。

我的第一个问题,它是如何进入循环并加入计数的?是每次我键入空格字符的时候?如果是的话,它怎么知道我在数单词呢?

using namespace std;
int main() {
    int count;
    string s;
    count = 0;
    while (cin >> s)
        count++;
    cout << count << 'n';
    return 0;
}
我的第二个问题。谁能给我解释一下std命名空间对初学者来说意味着什么?

当您执行cin>>字符串时。你将读一个单词并把它放在字符串中。是的,它将一个字符一个字符地读取,直到到达分隔符。

Std表示标准。标准c++库位于std命名空间内。您可以使用命名空间std:

重写没有的代码。
int main() {
    int count;
    std::string s;
    count = 0;
    while (std::cin >> s)
        count++;
    std::cout << count << 'n';
    return 0;
}

我不鼓励新手使用使用命名空间std

语句的,因为这样很难理解发生了什么。
  1. Cin将捕获输入直到一个空格,是的。在找到文件结束符(EOF)或提供错误输入之前,您所拥有的特定样式的循环将一直运行。对我来说,这个循环看起来不像常见的c++实践,但这里有描述。

2。namespace std是你如何告诉编译器在哪里寻找你在代码中引用的对象。因为不同的对象"在"不同的命名空间内,您要么必须告诉编译器它们具体在哪里(又名std::cin),要么为了方便起见告诉它您将来使用的对象将在哪里(使用using namespace std)。

在您的代码中,cin >> s试图从输入流中读取std::string。如果尝试成功,则返回值cin >> s隐式转换为true, while循环继续,计数器自增。否则,当尝试失败时,while循环退出,因为没有更多的数据可以从输入流中读取。

您可以使用std::distance来计数单词,如下所示:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
int main() {
        std::istream_iterator<std::string> begin(std::cin), end;
        size_t count = std::distance(begin, end);
        std::cout << count << std::endl;        
        return 0;
}

Demo: http://www.ideone.com/Hldz3

在这段代码中,创建了两个迭代器beginend,并将它们都传递给std::distance函数。计算beginend之间的距离。距离只是输入流中字符串的数量,因为迭代器begin迭代来自输入流的字符串,end定义了迭代器的结束,begin停止迭代。begin在字符串上迭代的原因是std::istream_iterator的模板参数是std::string:

 std::istream_iterator<std::string> begin(std::cin), end;
                     //^^^^^^^^^^^

如果将其更改为char,则begin将迭代char,这意味着下面的程序将计算输入流中的字符数:

#include <iostream>
#include <algorithm>
#include <iterator>
int main() {
        std::istream_iterator<char> begin(std::cin), end;
        size_t count = std::distance(begin, end);
        std::cout << count << std::endl;        
        return 0;
}

Demo: http://www.ideone.com/NH52y

同样,如果你开始使用<iterator>头文件中的迭代器和<algorithm>头文件中的泛型函数,你可以做很多很酷的事情。

例如,假设我们想要计算输入流中的行数。那么我们要对上面的程序做些什么改变来完成这项工作呢?当我们想要计数字符时,我们将std::string更改为char的方式立即表明,现在我们需要将其更改为line,以便我们可以迭代line(而不是char)。

由于标准库中不存在line类,我们必须自己定义一个,,但有趣的是,我们可以将其保留为空,如下所示,具有完整的工作代码:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
struct line {};   //Interesting part!
std::istream& operator >>(std::istream & in, line &) 
{ 
   std::string s; 
   return std::getline(in, s);
}
int main() {
        std::istream_iterator<line> begin(std::cin), end;
        size_t count = std::distance(begin, end);
        std::cout << count << std::endl;        
        return 0;
}

是的,除了line,您还必须为line定义operator>>std::istream_terator<line>类使用

Demo: http://www.ideone.com/iKPA6