说句闲话:C++ 的 enum 是个啥?
本文简单介绍 C++ 中 enum 关键字在 OI 中的用处,范围为 C++14,编译器为 GCC。
拜谢语法大神 @zengqhuai 的科普。
高级的 define
POV:你在做数据结构题,主函数 for 循环内的代码可能是这样的:
for(int i=1;i<=q;i++){
int op;cin>>op;
if(op==1) // 单点加
else if(op==2)// 区间加
else if(op==3)// 单点查值
else if(op==4)// 区间求和
else if(op==5)// 区间取 min
else if(op==6)// 区间取 max
}
在 OI 题目中,给不同的操作种类一个特定的数字来让输入便于处理是常见的。当然,也有给不同操作相同数字的神金题目,看这里。
当然,不只有输入时需要用数字区分操作种类,有时候我们写了一个集成了部分相似功能的函数,需要通过判断操作转到不同的片段执行。又或者我们在做一个 DP,各种状态的转移通过加减数实现,不同的转移操作对应不同的数。此时如果我们能用操作名代替单纯的数,可以很好的提升我们的代码清晰度。
于是有 enum 的第一个功能:批量 define。
enum 的用法类似一个结构体:
enum{ ADDP,ADDS,QP,QS,QMAX,QMIN }; // 注意 QMIN 后面不用加 ;
上述代码在 OI 能用到的作用中等价于:
#define ADDP 0
#define ADDS 1
#define QP 2
#define QS 3
#define QMAX 4
#define QMIN 5
也可以是:
const int ADDP=0,ADDS=1,QP=2,QS=3,QMAX=4,QMIN=5;
但是我们想让 ADDP 从 1 开始枚举,此时只需要:
enum{ ADDP=1,ADDS,QP,QS,QMAX,QMIN };
// 1 2 3 4 5 6
于是上文的 for 循环可以改写为:
enum{ ADDP=1,ADDS,QP,QS,QMAX,QMIN };
int main(){
...
for(int i=1;i<=q;i++){
int op;cin>>op;
if(op==ADDP) // 单点加
else if(op==ADDS)// 区间加
else if(op==QP)// 单点查值
else if(op==QS)// 区间求和
else if(op==QMAX)// 区间取 min
else if(op==QMIN)// 区间取 max
}
}
枚举中的每一个量都是一个 const int,不可以给它在 enum 外赋值,也不可以给它一个浮点数。
// this got CE
enum {
ADD=0.1,MULT,SUB,DIV,QV,QMAX,QMIN
};
cout<<ADD;
// also this
enum {
ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
ADD=733;
分段枚举
我们可能想让某些元素在一段中枚举,一些在另一段中枚举,此时可以给枚举元素赋不同的初值:
enum{A=1,B,C=6,D,E};
// 1 2 6 7 8
enum{ A=-3,B, C=-7,D, E};
// -3 -2 -7 -6 -5
奇怪的 struct
enum 也有类似结构体的功能。
你可以给你的 enum 一个类型名字:
enum E{a,b,c,d,e};
你当然可以用这个类型定义一个枚举变量:
enum E{a,b,c,d,e}test;
E test; // or this
这个 test 相当于一个 int,可以且仅可以被自己枚举类型里面的元素赋值。
// this is ok
enum E{
ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
a=MULT;// a=2
// this will got CE
enum E{
ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
a=1;
如果你要给这个变量输入一个值,仅有 scanf() 能做到,且此时该变量可以被输入正常 int 能接受的所有值。
// this is ok
enum E{
ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
scanf("%d",a);
// this will got CE
enum E{
ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
cin>>a;
你说它有什么用呢?我没看出来有什么用。
用处就这些了喵。

浙公网安备 33010602011771号