0、 前言
经历了第一次正式比赛(2017JSCPC),深感基础的不扎实,写写这些东西,也权当是巩固一下基础了。
首先,必须要声明,这个教程并不会面面俱到;但是作为入门是足够的。C++包罗万象,若是想要深入研究,推荐在学会我后面讲的各种内容之后,再去看看C++ Primer、Effective C++、Effective STL等书。
其次,我默认此文的读者是学过C的,相关内容不会赘述。
在开始之前,还有一点废话要说——
0.1、 代码风格
1、命名
变量名、函数名,不必特别清晰,但至少要能让自己看懂,以后回顾代码的时候能很容易知道其作用。
一般,我们采用这样的命名策略:
变量名: vecNum(从第二个单词起首字母大写)
常量名:MAXN,INF(全部大写)
函数名:FuncName(每个单词首字母大写)
至于是否要用缩写,就自行权衡一下利弊吧。
(顺便,变量命名时应有意识地避开标准库中定义的名称。)
2、格式
该换行换行,该空格空格。
千万别写成这样:
Intfun(int par){for(;;){(state1);(state2);(state3);}}
以及,虽然将很多语句复合在一起能够加快速度,但无疑不利于理解,而且易出bug。
3、坚持一种良好的风格,并养成习惯
0.2、 C++
C++= C + 面向对象+ 模板+ STL (Effective C++)
面向对象和模板相关的内容这里只会简单涉及到,主要讲解ACM中极常用到的STL相关内容。
头文件
C中头文件格式基本为 xxx.h,在C++中建议用 cxxx 替换。
例:#include <cstdio>
#include <cmath>
C++头文件无.h的后缀。
基本的输入输出
#include <iostream>
int main()
{
int num;
std::cin >> num;
std::cout << "输入为:" << num << std::endl;
return 0;
}
cin:标准输入
>>:输入运算符
cout:标准输出
<<:输出运算符
endl:换行符
(输入输出运算符的方向与数据流方向相同)
cin cout使用较为方便,但当数据多于1e5时,它们将会很慢,因此,对于输入输出数据组数较多的情况,应使用scanf和printf。
using namespace std;
加上这条语句,上面的代码就能改为:
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
cout << "输入为:" << num << endl;
return 0;
}
:: —— 作用域操作符
在使用using语句之前,cin等名字定义在命名空间std中,无法在外部直接使用,需要通过std::cin的形式,才能正确访问。
使用这一语句,相当于声明:我将要使用std中定义的名字,之后就不用再声明命名空间了。
(using用法不止于此,可自行研究)
常量定义
用const常量代替define宏定义。
例: const int INF = 0x3f3f3f3f;
const double EPS = 1e-6;
结构体(类)的定义方式
C中需要使用typedef来定义“结构体类型”,才能用此类型名定义结构体变量。
C++中,无需使用typedef。
struct Node
{
int elem;
Node *next;
};
Node *T;
引用
引用相当于为变量(常量)定义别名、同义词,引用与指针有很多相似之处,也有很多不同。
int num;
int &ref = num;
引用也有很多使用上的技巧,可自行百度。
0.3、不会讲到的内容
智能指针与内存管理
类(继承)
模板
……
以及各种零碎的内容和高级技巧。