这个程序是如何工作的
How does this program work
这是我的第一个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
语句的,因为这样很难理解发生了什么。- 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
在这段代码中,创建了两个迭代器begin
和end
,并将它们都传递给std::distance
函数。计算begin
和end
之间的距离。距离只是输入流中字符串的数量,因为迭代器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
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个