文章搬运自自己的Github网站algarth.github.io
本篇博客为的是复习一遍C++的基础知识,方便从C语言更快的转型为C++语言
本文只是快速的提供模板和粗略的将部分代码一笔带过
前言中当然要感谢柳婼姐和CSDN的c++相关资料,
那么,我们进入正题:
本文打算按照以下顺序进行讲解
1.C++ 语言的优势
2.初步的C++用法介绍
3.板子的提出
4.依据板子进行其他的讲解
5.板子中其他头文件的用法说明
6.其他不在板子内的常用函数写法和C++11
作为一个年轻的C++入门学生,我肯定不能介绍C++语言优势介绍的很详细。但是在竞赛中,使用C++语言相对于JAVA语言和C语言的优势我还是略懂一二的
1.C++语言书写方便,相对于JAVA来讲没有一般不需要在竞赛中反复写class,而且单看输入输出,节省了java中sysout的用法,同时不需要scanner
2.C++语言方便C语言学习的同学上手,C++语言在当初开发的时候就是BS大神考虑增强C语言的能力开发的*“带类的C”*,C++语言对于C语言是完全兼容的
3.C++提供了较多的模板(STL),对于即使没有学过数据结构的新生来说十分友好,并且节省了大量的代码行数,当然弊端是回头学数据结构的时候就不想打了
首先看一个基本的C++代码
#include
using namespace std;
int main(){
int n;
cin>>n;
cout<
学过C语言的同学是不是觉得简单易懂!!
那么先说几点和C语言不同的地方:
C语言中需要写入stdio.h头文件,在C++中仍然需要写入头文件,原本C语言中的头文件都是.h(head)格式的文件,在c++中不再使用这样的文件了,取而代之的c++头文件,iostream因为包含了cin,cout还有cerr等新的面向对象语言的输入输出方式,所以不得已取消了stdio的应用,当然,源文件是随着编译器不断变化的,如果你是devc的爱好者,其实devc中iostream内部包含了stdio的全部内容,当然其他编辑器可能并不那么友好,比如VS编译器。
原本的C语言中的头文件比如math.h之类的仍然可以在c++中使用,但是c++提供了更方便的使用方法,只需要去掉扩展名,并在前面加上字母c就可以方便使用了。举个例子
#include
#include
#include
这些写法分别对应着C语言相应的头文件
namespace是为了解决C语言中重复使用相同变量名问题的,比如两份不同学校的代码要拷贝到一起,但是中间有很多变量名是相同的,我们通过namespace指定一个学校名就可以解决问题了,比如两个zs,一个是a学校的zs,一个是b学校的zs,毕业之后就是a::zs和b::zs,这里的双冒号就是c++在指定namespace下属的写法
但是其实很多c++自带的东西都是写在std下的,所以其实在学算法的时候不用深挖,直接每次写上using namespace std就是了,如同H5当中指定base嗷~
这两个兄弟其实很令人舒服,cin和cout其实真的相当舒服好用,既不用像java和C语言那样指定类型输入,而且写起来还简单,舒服啊
写的时候这个尖括号的理解其实是这样的,尖括号其实是一个运算符,这个运算符在cin的时候形象的理解为将数据输送到括号指向的那个方向,cout的时候指向cout这里,是把数据写入数据流,就可以了
cout的最大弊端是按格式输出内容不如printf,所以如果遇到按格式输出,不要犹豫,直接printf
当然其实在cin,cout中不指定类型让机器判断也是有弊端的,这个下文会提到
endl就是C语言中的\n,c++仍然可以使用,但是要在字符串中使用,本质上来讲endl确实速度会慢一点,因为有刷新流的事儿,但是不用担心。他最大的优势就是使代码看起来很简介很舒服。
cout<<"hello world"<
其实我超级喜欢用板子的
首先板子分为很多种,有时一般把常用的算法称之为板子,但是我这儿的板子单指打代码开始的时候加上的框架
话不多说,上板子!!
#include
#define asd cout<<" SB "<
这套板子我始终放在自己的搜狗快速输入栏,实在是相当的好用,当然具体怎么放取决于你的想法,(比如我把define的单独放在一起,其他的放在一起)
其实在devc中有一个设置可以在创建文件的时候自动生成框架
板子内容先解释一波
万能头文件,懂得都懂,包含了c++和C语言几乎所有头文件,在VS上可能没有,需要手动添加。有了他,再也不用担心哪一天写头文件写少了!!
这是一种拿编译时间交换执行时间的方法,但反而oj在判题的时候只看执行时间
当然弊端是有些平台不支持,有些比赛也是
这堆define都是相当灵性的定义,中间定义了方便调试的asd,ll快捷写法,和整数无穷大,Ox3f3f3f3f是一个好用的数字,他是1e9左右的数字,但是2倍又不会超过2147483647,所以一般表示无穷大很好用!!
(当然根据罗勇军的说法来看,常量定义的时候最好用const定义而不是的define,防止在打赛的时候出问题)
这个是关闭同步流,cin和cout采用的不是一套输入输出,为了兼容性,每次使用cin,cout的时候都会去和scanf和printf进行同步,这项操作使得cin,cout不够快,为了更快输入输出,直接关了同步流,一切就迎刃而解了,但是不要关了之后再两种输入输出混用
这个不到万不得已我不用,O加速是分为各种类型的,通常使用的是O2加速
#pragma GCC optimize(2)
可以这么理解,你的代码为了写着简单,就啥也不管了,最后跑项目的时候都要通过各种方法优化之后执行。但是随着社会内卷越来越厉害,出题人也在不断内卷,出题人开始用坑人的时间卡算法,那种时候就要对他使用O2吧!
其实O加速其实很多,下文列出所有的加速,感兴趣可以看看知乎的回答,其他地方不是很好搜到有关内容
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
解除cin和cout的绑定,进一步加速,但是我之前有一次加上之后WA了,就不敢用了www
后续内容发下期
我是ALgarth,如果有缘,我们下次再见。
图片来自网络,侵删。
本人拙笔草见,如果内容有误,请及时联系修改