Структура данных перечисления C ++ - PullRequest
1 голос
/ 24 октября 2010

Может ли кто-нибудь дать мне реальную потребность в структуре данных enum. Как в примере в какой-то реальной системе, где это может быть использовано? И в чем причина такой структуры данных? Данный пример был

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

Но я чувствовал, что это похоже на строковый массив. Я пытаюсь понять понятие, с помощью которого эта функция была добавлена ​​в C ++. Спасибо!

  • С уважением Sethu

Ответы [ 5 ]

3 голосов
/ 24 октября 2010

Например, рассмотрим это перечисление:

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

Это представляет номер протокола IP в пакетах IP.Внутри пакета номер протокола идентифицируется числом , а не именем (8 бит при смещении байта 9).Это перечисление позволяет источнику программы обращаться к именам, таким как icmp и tcp, а не к числам.Номер должен использоваться внутри самого IP-пакета.

2 голосов
/ 24 октября 2010

Перечислитель (например, black в вашем примере) представлен целым числом;сравнение целых чисел fast .Сравнение строк не быстро.

Кроме того, вы получаете безопасность типов.Если вы использовали строки типа "black" и "blue", нет гарантии, что кто-то не пропустит вас "hot dog", когда вы ожидаете цвет.Если вы берете color_t, вы гарантированно получите правильный цвет (если кто-то не пошел и не сделал что-то не так).

2 голосов
/ 24 октября 2010

Когда вы используете enum, значения (такие как black, green и т. Д.) Являются символическими именами, которые представлены внутри как целые числа.

Если вы использовали строковый массив, то каждый раз, когда вы хотите использовать одно из этих значений, вам нужно будет скопировать строку, выполнить сравнение строк и т. Д.

Кроме того, enum может только содержать предварительно определенные значения, что желательно в большинстве случаев. Если вы представляли то же самое, что и строка, такой гарантии нет.

1 голос
/ 24 октября 2010

Кстати, Бьярн Страуструп говорит о том, что enum s вводит в C ++ в своей книге Дизайн и эволюция C ++ с утверждением "Перечисления C представляют собой любопытно недоделанную концепцию. Перечисления не были часть первоначальной концепции C и, по-видимому, неохотно вводились в язык как уступка людям, которые настаивали на получении формы символических констант, более существенных, чем макросы Cpp без параметров ». (раздел 11.7, «Cpp» относится к препроцессору C, в остальной части раздела рассказывается о решении сделать каждый enum отдельным типом в C ++ вместо того, чтобы все они были int s, как они изначально были в C и ранее. версии C ++).

enum s в основном предназначены для замены #define s в более ранних версиях C.

// 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);

enum с разрешено в switch выражении case метках (как и #define с и const 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;

Если вы когда-нибудь увидите enum с явными значениями, которые являются степенями 2, вы можете почти гарантировать, что он будет использоваться таким образом.

1 голос
/ 24 октября 2010

1) Перечисление против целых чисел: Перечисления легче читать, и, следовательно, код более удобен для обслуживания.

2) Перечисление против строк: Перечисления намного эффективнее (также эффективны, как целые числа).

Дополнительное преимущество: перечисления автоматически ограничиваются диапазоном значений, которые вы предварительно определяете.Это также означает, что они полезны только тогда, когда диапазон значений невелик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...