繁体   English   中英

C ++枚举数据结构

[英]C++ enum data structure

有人可以给我实时需要的枚举数据结构。 如在某些实际系统中可以使用它的示例中? 拥有这种数据结构的原因是什么? 给出的例子是

enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 

但是我觉得,这类似于字符串数组。 我试图了解将此功能添加到C ++的概念。 谢谢 !

  • 问候塞图

例如,考虑以下枚举:

enum ip_packet_type {
    ip = 0,
    icmp = 1,
    igmp = 2,
    tcp = 6,
    udp = 17,
    // many others
};

这表示IP数据包中的IP协议号。 在数据包内部,协议号由数字而不是名称 (字节偏移量9处为8位)标识。 通过此枚举,程序源可以引用icmptcp类的名称,而不是数字。 该号码必须在IP数据包本身内部使用。

使用enum这些值(例如blackgreen等)是内部以整数表示的符号名称。

如果使用字符串数组,则每次您要使用这些值之一时,都需要复制字符串,进行字符串比较等。

此外, enum 只能包含预定义的值,这在大多数情况下都是理想的。 如果您表示的内容与字符串相同,则无法保证。

枚举数(例如您的示例中的black )由整数表示; 比较整数很快 比较字符串不是很快。

此外,您还将获得类型安全性。 如果您使用了诸如"black""blue"类的字符串,则无法保证某人在期望使用某种颜色时不会通过您的"hot dog" 如果使用color_t ,则可以保证获得有效的颜色(除非有人走了,做错了什么)。

1)枚举与整数:枚举更易于阅读,因此代码更易于维护。

2)枚​​举与字符串:枚举效率更高(等效于整数)。

附加优点:枚举自动限制在您预定义的值范围内。 这也意味着它们仅在值范围较小时才有用。

为了便于记录,Bjarne Stroustrup在《 C ++ 的设计和排除 》一书中谈到了将enum S引入C ++, 声明“ C枚举构成了一个奇怪的半生半熟的概念。枚举不是C原始概念的一部分,并且显然不愿意对语言的介绍是对那些坚持让符号常量的形式比Cpp的无参数宏更重要的人们的让步。” (第11.7节“ Cpp”指的是C预处理程序,本节的其余部分记录了决定使每个enum在C ++中成为一个单独的类型,而不是像它们最初在C和C ++的早期版本中那样将它们都设置为int ) 。

enum主要是用来替换C早期版本中的#define的一种方式。

// based on UNIX file permissions
#define EXECUTE 1
#define WRITE 2
#define READ 4

const int EXECUTE = 1;
const int WRITE = 2;
const int READ = 4;

enum File_perms {
    EXECUTE = 1;
    WRITE = 2;
    READ = 4;
};

使用哪种很大程度上取决于个人喜好 enum确实提供了一种形式的文档,说明变量应具有哪种值:

int permissions = 4; // Was that file permissions, database permissions, or something else?
File_perms perms = 4;

这在函数签名中特别有用:

int fiddle_bits(int, int); // I can never remember if I pass the file permissions as the first or second parameter ...
File_perms fiddle_bits2(File_perms, int);

switch语句case标签中允许使用enum#defineconst int ):

switch (perm) {
    case READ:
        ...
    break;
    ...
}

但是,请注意,这可以分配数字来enum s表示没有标记值(C ++ 0x中增加了一个enum class不允许此):

File_perms perm = 7; // a.k.a., File_perms perm = EXECUTE | READ | WRITE;

如果您看到带有以2的幂表示的显式值的enum ,则几乎可以保证将以这种方式使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM