在C++中,我们为了完善程序功能和阅读程序方便会开很多变量或函数等的名称[1]。看看下面列举的名称你开过那些?
> 1、n
>
> > n一般是用于多组数据输入时的组数,最常见的是一维数组中确定长度的时候大多都用变量n。
>
> 2、t和n
>
> > 正如我们在ACGO欢乐赛、排位赛、挑战赛中所见一样,有时候竞赛题目中会有多组数据,一共有t组,每组又有n个小组数据。
>
> 3、n和m
>
> > 还记得二维数组深度一般是n,宽度一般是m,形式如array[n][m]的二维数组在迷宫题目中很常见。
>
> 4、st
>
> > 在使用集合时,我们常常会把集合set缩写为st作为集合名称,这很常见,只可惜ACGO还没有发布集合的题目。
>
> 5、v或vec或ve或vect
>
> > 在使用动态数组(又称向量)vector的时候,我们也会把它缩写为v或vec作为变量名,当然ve、vect等都可以。但是用到vector的题目较少,一些vector用到时都可以用数组
>
> 6、s,t,v
>
> > 小学的时候,路程=速度*时间的公式就耳熟能详了,那么,在换成字母时,我们常常把路程写成s,速度写成v,时间写成t。
>
> 7、a或arr
>
> > 数组(array)是编程中一个重要的工具,可以存储一连串相同类型的数据。而很多时候我们会把数组名写为array缩写arr,甚至更简单的是a来代替。当然,有的人在用了arr后,喜欢往后延续写作brr、crr、……。
>
> 8、bucket或b
>
> > 说到数组,不由得会想到桶排序时我们用到的桶数组,大多人会根据它的英文名叫它:bucket。当然,你也可以取它的首字母b作为数组名称。
>
> 9、stk
>
> > 栈是一个LIFO的容器(Last In First Out),它可以帮助我们解决一些生活中的问题,比如火车进出站时总是先进来的在里面,后进来的在外面,导致后进先出。栈英文名叫做stack,许多人喜欢缩写为stk来作为变量名。
>
> 10、q
>
> > 队列是一个FIFO的容器(First In First Out),它也可以解决生活中的一些问题,比如排队人们自觉排在队尾(当然一些插队狂和VIP除外)。队列queue读音非常像字母Q的发音,所以大家都喜欢取它首字母q作为变量名。
>
> 11、mp或者MAP或者mapp或者ma或者……
>
> > map有两个含义:一个是C++或Python中的字典(实际上Python中叫做dict或者dictionary),另一个是深搜/广搜中的地图。在作为变量名时,为了不和容器map搞混,常常会省略中间的a或者开大写或者double p或者省略p或者……………………。
>
> 12、vis
>
> > 学到搜索时你会知道:标记数组是个好用的东西。标记数组在搜索时,常被命名为vis,当然也有人喜欢叫他vid或者b等其他名字。
>
> 13、p
>
> > 都知道map是由键值对构成的,那么它每项就是一对一对的。在C++ 中,有个容器叫做pair,常常被简写为p作为变量名。当然,C++中开p的名称,除了pair还有可能是指针变量的名称,指针英文叫做pointer,因此一般把指针变量名称取名为英文名称的首字母p。
>
> 14、dp
>
> > dp是动态规划英文的缩写,因此我们也常常把它作为动态规划数组的名称。当然,也不是不可以作为递推的数组名称。
>
> 15、dq
>
> > 双端队列deque虽然叫做队列,但是实际上它不是线性表。因为名字读起来像DQ,所以常常开变量名叫做dq。如果p和q容易搞混的话,那么dp和dq就更容易分不清了。
>
> 16、str或s
>
> > string字符串是一个比较神奇的东西,它是C++才加进来的面向对象的概念,在C语言中它是char类型数组。string类型在Python中叫做str,所以会有人把它叫做str。本人而言,s是优选,因为s不光可以表示字符串,还可以用作变量、数组、集合、递推数组、甚至于dp数组的名字上,个人觉得还是“万能”的。
>
> 17、node和tree
>
> > 如果学到了树就知道,树很少用链表或者一般用数组。当开了结构体来表示树的节点时,node是树的一个节点类型名称,而tree一般是数组的名称。
>
> 18、x和y
>
> > 在二维数组中,需要用array[i][j]表示二维数组中的一个元素,到了搜索时常常用x和y表示一个节点的位置,和平面直角坐标系类似。唯一不同的是,它和平面直角坐标系是相反的。
>
> 19、c或ch
>
> > 众所周知,有个数据类型叫做char,字符变量一般取char首字母c或者前缀ch来表示。当然,对于特定情况而言,你也可以把c作为计数变量的名称,一是因为c是count的缩写,二是因为当自增时写为c++十分“有趣”
>
> 20、cnt
>
> > 前面提到了count,而一般情况下我们是把计数变量开为cnt而不是c,或者不导入<algorithm>库时用count直接表示也可以。当你导入algorithm库是千万不能开count,因为algorithm库中有个函数名称叫做count。
>
> 21、ans或answer
>
> > 二分答案中,我们会得到一个最终通过二分得到的答案,而这个答案一般用ans保存。事实上,计算结果、统计结果等都可以用answer或者其缩写形式——ans来表示。
>
> 22、f或flag
>
> > 相信大家都开过标志变量,就是类型为bool的01状态的那种变量。标志变量就相当于一面小旗子,提醒我们是否完成了某件事或达到某个程度或目标,所以用flag,简写为f
>
> 23、lst
>
> > 学到链表后就会知道,万能头中包含了一个库叫做list,其实就是链表。Python中列表叫做list,所以Python中列表变量名叫做lst,C++中也适用。
>
> 24、sum
>
> > 为什么我喜欢用s来代替一些变量和数组?sum是一个好的例子。sum用作变量时可以存放一个数组中[l,r]区间的元素和,用作数组时是前缀和数组,实际上是一个数组的预处理。当然,在sum用作变量的时候,也可以作为累加器,累加一个容器(如数组,也可以是不断的输入)中所有数值的和,非常好用。
>
> 25、d
>
> > d实际上是difference的缩写,d一般用于差或者差分数组的名称,十分好用,在差分时会避免模拟带来的TLE。
>
> 26、i,j,k,……
>
> > 只要学到for循环就会用一个代码框架:for(int i=0;i<n;i++)。在这之中,i是一个int类型的变量,它只能在for循环内使用,也叫局部变量、临时变量。临时变量其实可以随意开,i、j、k等等都行,这也是最常见的局部变量。
>
> 27、dfs和bfs
>
> > 这两个函数名分别代表了深搜和广搜。深搜(深度优先搜索Depth First Search)和广搜(又称宽搜,广度/宽度优先搜索)是搜索好帮手,迷宫问题的克星。深搜运用递归写,属于不开函数不行的那种;广搜也可以不开函数,在主函数中用结构体队列完成。
>
> 28、is_prime(prime)和is_pal(pal)
>
> > 事实上,官方AC君已经在题目中给过我们这两个函数了,is_prime判断是否为质数,is_pal判断是否为回文数。证据确凿,这道题就有。
>
> 29、cmp
>
> > 在结构体数组排序时,如果你不想手写一个冒泡/选择/插入/……时,你可以用algorithm库中的sort函数配上你的cmp(compare)函数来排序。
>
> 30、l或left,r或right,m或mid或middle
>
> > 这是二分查找和二分答案常常用到的变量名,确定好下限l和上限r后,进行中间mid检测,然后重定范围进行折半查找数值或答案。
>
> 31、st
>
> > 根据ACGO用户评论,C++中有一个容器叫做st表,它一般也可以用st表示,所以当你用到集合和st表时,最好集合用s或set1等,把st留给st表吧。
>
> 32、tag
>
> > 根据用户评论:线段树必带 dat/val,线段树存值的地方。
>
> 33、check
>
> > 确实,虽然我没有开过check,但是确实看到很多用户喜欢在搜索中判断是否越界用check函数,十分的好用,免得到时候if里边一长串看得头晕。
>
> 34、mx或ma或maxn,mn或mi或minn
>
> > 这些是为了防止和iostream头文件里自带的函数max和min重名,自己开的最大最小值的变量名。当然,数组中也可以用algorithm库中的max_element和min_element函数求最大最小值。
>
> 35、n,m,k
>
> > 打过欢乐赛的用户都知道,ACGO官方喜欢在题目中提到n、m、k三个变量名,ACGO用户评论:这是编程数量变量名的三巨头。
>
> 36、n1,n2,n3,a,b,c,etc.
>
> > 这些是用户常常为了偷懒做的一些事情:在一个字母后面加上数字变成不同变量名,或者直接从a开始一个个字母往下用。萌新为了节省时间可以用,但:一定要搞清楚每个变量的含义!
>
> 37、cost和dis和val
>
> > 根据ACGO用户评论:这几个名称有时候也会开,是为了记忆化搜索,但是相对其他而言比较冷门。当然,你也可以用这个写图论。
>
> 38、f或fun或func
>
> > 这些都是函数英文function的缩写,一般而言,如果练习或者随便定义的函数,或许会用到这些名字。
>
> 39、start_x或sx,start_y或sy,end_x或ex,end_y或ey
>
> > 这些变量最大作用是在于搜索时告诉你开始位置字符为Z结束位置字符为W这种类似的情况,我们可以对字符进行判断,并把坐标存储在这四个变量中。当然,也不排除只要sx和sy或只要ex和ey或什么也不要的情况。
>
> 40、sort之类的函数
>
> > 说到排序,一定会想到这些:冒泡排序Bubble_Sort(),选择排序Selection_Sort(),插入排序Insertion_Sort(),桶排序Bucket_Sort(),快速排序Quick_sort()或者qsort(),归并排序Meige_sort()或者msort()等方法,以及<algorithm>库中的sort()函数。其实,一般写排序函数的时候就会写一个sort()在不导入algorithm库的情况下,当然也可以写全称;但是在写快排的时候,我们一般写成qsort()。这些都是比较容易理解的排序方法。
>
> 41、find()
>
> > find()函数存在于<algorithm>库中,一般适用于数组、向量、集合(当然集合自带一个二分的find,效率更高)等数据类型中。自己写find主要是 “并查集” 中查找朋友(或者形象地说应该叫老大)或者亲戚的时候会手搓一个递归写的find()函数。对于合并,一般自己定名字,个人建议带有union(集合的并集叫做set_union())但不要写为union(因为union是关键字)。
>
> 42、大写N或者MAXN等
>
> > 之所以不写成int s[10005]是因为可能还有其他的数组要开这样大小,到时候直接写成int s1[N]会比int s1[10005]方便许多。常量N会帮我们简化代码量(个人觉得有点像数学中的换元法)。
>
> 43、fin,fout
>
> > 当我们使用fstream头文件完成文件输入输出时,我们会定义两行代码:ifstream fin("file.in")和ofstream fout("file.out")。这之中,使用了文件输入输出流,可以使我们用fin>>a和fout<<a这样的代码完成文件输入输出。其中,我们定义的是fin和fout,当不导入iostream的时候,也可以改写为ifstream cin("file.in")和ofstream cout("file.out"),此时定义的名称为cin何cout。
>
> 44、ll
>
> > 在C++中,你或许见过这样的代码:
> >
> > 或者是这样的:
> >
> > 还可能是这样的:
> >
> > 这样其实是把long long类型简写为了ll,只是为了打代码更方便,你再次使用long long也可以。
> > 不过,有时候由于题目中大量使用了int\blue{int}int类型存储但想起来要用long long,你可以直接这样:
> >
> > 只不过,你int main()\blue{int}\ \orange{main}()int main()语句应当变换为signed main()\blue{signed}\ \orange{main}()signed main()而已,比较方便,我看到许多人的代码题解中也有用到。
>
> 45、pre,now,next
>
> > 根据ACGO用户反馈:pre,now,next三大时态家族,都是dfs,bfs,A*,IDA*,链表,启发式,模拟的神。
>
> 46、p(另外的用法)
>
> > 据ACGO用户评论:当用到p的时候,一般是图论、几叉树(eg:如二叉树、三叉树、……),还可以是究极大模拟!
>
> 47、tmp或temp或t
>
> > 这是临时变量tmp、temp、t,常用的地方如交换两个变量的值和手搓的gcd()最大公因数函数中。
>
> 48、gcd,lcm
>
> > gcd(Greatest common divisor)是最大公因数的缩写,常常用while循环或者递归完成函数定义。lcm(Least common multiple)是最小公倍数的缩写,定义函数时一般是先求出乘积,再除以gcd的返回值得到的。
>
> 49、dir(s)
>
> > 玩过dfs和bfs的用户都知道,如果一个一个方向自己手打的话来搜索太累了。于是,我们可以使用方向数组dir。以迷宫为例,往上下左右移动一步就是dir[4][2]={1,0,0,1,-1,0,0,-1};针对马走日或马的遍历,有dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};对于八个方向的走法,如数水坑或水洼计数,方向数组因变为dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1}。当然,在作为数组名时,dir(direction缩写)会包含多个方向,所以可以在后边加上s。
>
> 50、mod或Mod或MOD
>
> > 一些题目因为最终数据结果Ti大了,所以会要求结果对一个数取余,这个数一般会写成这样的形式:
> >
> > 这样,我们最后结果就可以直接写成:
> >
> > 这样的形式,看上去比较简洁,尤其是在要多个地方取余时很实用。
>
> 51、h、e、w、ne
>
> > 据ACGO用户评论:这四个变量也很常见,主要在链式前向星上一起使用
>
> 52、f(或l、r等其它等价用法)
>
> > 在广度优先搜索时,我们会需要取队列的首元素,这个时候,我们经常把存放首元素的变量开为f(front的首字母),也有时候用其它的名字。
>
> 53、x和xx和nx,y和yy和ny
>
> > 在搜索算法中,对于迷宫类型题目,我们常常需要坐标(x,y)来表示搜索到的位置,在dfs()函数中一般会传参数:
> >
> > 这时x和y表示的是当前坐标;当然在深搜中会遇到走到新的位置的情况,那么一般是写成这样:
> >
> > 而在bfs的过程中,结构体队列每个元素结构大概是这样子:
> >
> > 这里结构体成员里面也有x和y,这两个也是表示坐标的;而在广搜过程中也需要去找下一个节点坐标,一般是这样:
> >
> > 注:以上代码中提到的dir数组表示方向数组,是一个二维数组。(详见49条)
>
> 54、i8,i16,i32,i64
>
> > 这些实际上是数据类型的别名。当我们用long long的时候可能会觉得打完这个数据类型太繁琐了,尤其是程序中有许多地方要这样打,由于long long实际上是64为的整型(integer),所以就会取别名为i64。同理,我们可以把int写成i32,short写成i16,char(本身运算逻辑其实还是整数类型)写成i8。
> > 实际上,在ACGO中,用户可以通过<cstdint>中的int8_t来表示char,int16_t来表示short,int32_t来表示int,int64_t来表示long long。上面说到的i8、i16、i32、i64实际上类似于<cstdint>中这些表示的方法。
>
> 55、ss或sstream等
>
> > 说到这个,大家可能有点陌生。因为这个事头文件<sstream>中的stringstream类型变量的常用名称。由于stringstream可以拆分为string和stream,所以取拆分后两个单词的首字母ss作为变量名比较合适。
> > [附] stringstreamstringstreamstringstream:
> > sstream实际上是stringstream的缩写,即“字符串流”<sstream>头文件可以帮助我们完成整数、浮点数和字符串这些形式之间的互相转换,也可以实现十转八、十转十六、十六转十、八转十这四个进制转换的操作,还可以将布尔值0和1转换为字符串的true和false(不过个人觉得没有直接三目( ? : )或if\red{if}if语句判断来的简单)。主要运算符和<iostream>类似,都是<<左移运算符和>>右移运算符。
>
> 56、bs
>
> > bs可以是二分查找 (Binary Search) 的缩写,即我们在做二分查找题目时为了方便或使用递归时定义的函数。当然,bs这个名字也可以作为<bitset>头文件中的bitset类型变量的名称。取名方法和上面的"ss"类似,将bitset拆成bit和set各取首字母即可。
> > [附] bitsetbitsetbitset:
> > bitset有一个作用是帮助我们实现十转二(调用to_string()方法)和二转十(调用to_ulong()方法)的功能,和sstream进制转换功能有些相似。
>
> 57、pi或pai
>
> > 在C++编程时,有时候我们会根据需要调用sin等三角函数而将角度改为弧度。那么这时,我们一般会定义一个变量存圆周率的值,通常写成const\red{const}const double\blue{double}double pi=3.1415926535,或者取名为pai也可以。
>
> 58、pq或heap
>
> > C++<queue>头文件中有个叫做priority_queue的数据类型,即优先队列。平时用优先队列时,我们可以把它的变量名叫做pq,即选取它的两个首字母p和q。当然,学了完全二叉树后,我们知道完全二叉树可以用一个叫做 “堆” 的东西来存储,而写代码时一般把堆用priority_queue实现,由于堆的英文名称是heap,所以我们也会将这样的变量名称叫做heap。
>
> 59、res或result
>
> > 这两个实际上和ans差不多,因为ans是answer答案的缩写,res是result结果的缩写,都是表示算法结果的意思。只不过我印象中,好像Python编程时上课经常开res,但是到了C++的编程算法课堂就开ans居多了。
>
> 60、x,y,z
>
> > x、y、z实际上类似于x轴、y轴、z轴,可以用它来表示三维的立体东西。当然,在C++中,我们可以用x、y、z来表示三维数组的一个位置上的元素,比如V[x][y][z]这样,就像表示三维坐标系中的一个点一样。
>
> 61、it或iter
>
> > 这个对于经常玩STL容器玩得滚瓜烂熟的小伙伴(简称玩的6)十分熟悉,因为vector、set、map、甚至于冷门的deque都可以用迭代器指针::iterator来遍历,比如,vector可以for(vector<int>::iterator it=v.begin();it!=v.end();it++)cout<<*it<<" ";这样子。
>
> 62、pos
>
> > 在有些题目中(包含迷宫搜索的题目)可能会提到坐标或位置这种词,这时候,我们就可以用pos来表示这个位置(或坐标),因为pos是position的缩写。一般而言,pos可能是int或者double类型的变量来表示在数轴上的位置,而当表示平面直角坐标系(二维坐标)上的位置时更多的可能是pair或者结构体类型。
>
> 63、L,R,LL,LR,RL,RR,LC,RC
>
> > 据ACGO用户评论:这些是“(滑动)窗口一家子”,就是说它们一家应该是用来表示题目中提到的这些“窗口”的位置和长度变量的,可以在相关题目中找到它们的身影。
>
> 64、u和v
>
> > 据ACGO用户评论:这两个变量在ACGO图论算法题目中经常碰到,表示从u到v的一条有向/无向边,实际上也很常用。
>
> 65、avg
>
> > 在求平均数时,通常会开avg变量,是average的缩写,只不过这个缩写取了开头的av和结尾的g,和其他缩写有些不同。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好啦,以上的名称,你开过几个呢?⏟(持续更新中...)\underbrace{好啦,以上的名称,你开过几个呢?}\\ (持续更新中...)好啦,以上的名称,你开过几个呢? (持续更新中...)
我已经数不清我改了多少稿了
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 当然,上述名称可能因人而异,还是要根据个人喜好。不过,在写题解时建议不要太随意取名字,以免造成误会。 ↩︎