竞赛向C++快速入门指南

前言:发现集训队的同学们用C语言的还是挺多的。从前几天就想着要不要自己也写一下关于如何快速入门C++的文章,就把这个捣鼓出来了。

由于ACM竞赛并不涉及很多高深的语法知识,所以能讲的也就一点点,距离真正能使用到C++的精华还差的很远很远(毕竟我C++也没学多好,面向对象也学的跟一坨*一般,正想着要不要重学。。)

本文仅介绍C++里面和C不太一样的地方,其他没有说到的部分,C语言怎么写,你就怎么写。

如果这篇文章能够帮到你,我会感到很荣幸。


开始使用.cpp文件

C++源代码文件以.cpp结尾。cpp文件可以帮助你使用C++里面不同于C语言的众多新特性。

这样,这就是一份C++代码了。

初识输入/输出流

这个东西如果当真的解释起来会相当的麻烦。但是可以简单的理解为它就是C++的输入和输出的主要方式。

所有的流输入/输出操作都在头文件<iostream>里,通过头文件就能大致判断出它的意思,它是instream和outstream的合成,其中instream又是由in(入)和stream(流)合成,代表输入流,同理,outstream代表输出流。

要使用流进行输入或者输出,需要借助于符号<<和>>。这个东西叫做流运算符,还是那句话,这个东西如果当真的解释起来会相当的麻烦。。。由于是入门向教程,这里就不做展开了。。形象的理解的话,可以把输入流和输出流认作“水流”或者“电流”等东西。

记结论!>>符号“向右走”,代表输入,<<符号“向左走”,代表输出。

形象点说,输入符号就好像是把输入数据顺着箭头导进去,而输出符号就好像是从变量里顺着变大的“箭头”把数据“喷出来”。。。

记结论!输入命令是cin,输出命令是cout!

再拆分一下这个命令,其实就是一个字母c外加in或者out。它要配合相应的流运算符进行使用。比如要输出helloworld,可以这样写:

cout << "hello,world!";

输出命令后面接上流运算符,然后是一个字符串,最后分号结尾,这就是最基本的输出语句。

于是你很兴奋的写下了这样的代码:

#include <iostream>
int main() {
    cout << "oh what the f**king C++!";
    return 0;
} 

结果发现……编译错误?

啥玩意?cout没有定义?后面那个std::cout又是什么东西……

实际上,这个东西如果当真的解释起来还是会相当的麻烦……这里面牵扯到C++里面的另一个东西——

名称空间(又称命名空间)

简单来说,cin和cout这个东西并不属于你,或者说,它并不属于任何人,你并不能直接去使用它。因为C++是一个面向对象的语言,这每一个对象都可以形象地理解为一个小系统,它也是“有胳膊有腿”的。

可是那为什么看别人题解里的代码都能用cin和cout呢?

实际上,cin和cout都有一个共同的主人,这个主人的名字叫std。当你试图使用cin和cout时,你并不能直接使唤这两个东西,而是去使唤他俩的主人,它才能听你的话。要使唤std这个人,首先得告诉std:“喂,std,让你家的cout给我往屏幕上输出一句‘hello,world’!”

然后std照做,cout照做。

这个操作翻译成C++代码就是这个样子:

std::cout << "hello,world";

其中,std代表一个名称空间。然而,在题解中几乎看不到我们用std::,这又是怎么回事呢?

实际上,std是我们最常用到的名称空间。几乎每天都会和std打交道。我们和std这个老伙计混的足够熟了,就可以在程序开头先给std说一句:“今天我用的都是你家的东西,先给你说一声,就不麻烦你成天来回跑啦”。这样,std就不会再来了,但是它会告诉家里的所有成员,你们的操作都得到我的批准了,有什么命令的话照做就好。然后呢?我们就可以直接用cout和cin,而不用再把std请来了。

这个操作翻译成C++代码就是这个样子:

using namespace std;

结合一下上边编译错误的代码:

#include <iostream>
using namespace std;
int main() {
    cout << "oh what the f**king C++!";
    return 0;
} 

编译,跑起来了。

一些问题

假如说我们要使用cin输入数据的话,直接cin>>即可,但是输入和输出的话还需要进行格式判断吗?

其实是不需要的。cout和cin可以自行判断数据类型,但是<<和<<以及>>和>>之间只能有一个变量。

也就是说,下面这段代码是不行的。

#include <iostream>
using namespace std;
int main() {
    int x, y;
    cin >> x >> y;
    cout << x, y << endl;//error
    return 0;
}

应该改成:

cout << x << y << endl;

呃。。endl又是什么东西?现阶段先简要理解成一个\n吧。要注意,上面的代码输出的x和y中间是没有空格的,要加空格的话需要这样写:

cout << x << " "  << y << endl;

虽然省去了格式符,但是要写好多流运算符,所以当输出格式比较复杂的时候,使用cout输出还是比较麻烦的,这种时候个人推荐改用printf。

对于保留几位有效数字,指定输出宽度等操作,cout的实现比printf要麻烦得多,如果在题目中遇到这种需求,还是用printf吧。

最后一个是性能问题。实际上,cin和cout的速度要比等价的scanf和printf慢很多,原因是内部实现问题,cin和cout牵扯到一些其他的东西,所以会稍微慢一些,但是这个问题可以通过一个命令进行解决。

ios::sync_with_stdio(false);

sync with stdio是ios家的东西(不是苹果那个ios喂!),sync是英文“同步”(同调)的简称(synchro),根据先前的讨论,要使唤它必须先告诉它的主人ios。函数传入一个参数false,代表关闭,整个代码的意思就是让程序关掉一个叫做“流同步”的东西,这样实测cin和cout的速度和等价的scanf与printf速度会基本相等。但是用了这个东西之后在使用freopen打开文件的时候会导致bug,这一点需要注意。

最后一点,C++语言有bool类型,它的值只能为true或者false,它一般是作为逻辑表达式的运算结果。C语言是没有bool类型的,所以都会用int进行代替。

其他人的想法我不清楚,但是我不太喜欢用int代替bool。

STL

(这一部分等我整理完ppt后发上来吧)


-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。