LINUX.ORG.RU

Структуры данных вопрос


0

1

Привет.

Есть enum:

enum MyEnum {
   a,
   b,
   c...
};

Как лучше хранить данные, если они могут иметь значение по типу И, т.е. a | b, или a | b | c и т.п. Пока на ум приходит что-то типа std::list<MyEnum>. Или можно по-другому?

★★★★★

Задай значения enum в виде степеней 2 (1, 2, 4...) и храни в целых.

ziemin ★★
()

Вообще для этого специально сделали std::set. Но есть ещё std::bitset, если жалко места.

E ★★★
()

Специально для этого существует std::bitset, хотя всё равно все хранят в обычных целых числах

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Хранят в битах, а числа -это детали релизации уже.

nanoolinux ★★★★
()
Ответ на: комментарий от UVV

Если чистый C — то в sys/param.h есть

/* Bit map related macros. */
#define setbit(a,i)     ((a)[(i)>>3] |= 1<<((i)&(NBBY-1)))
#define clrbit(a,i)     ((a)[(i)>>3] &= ~(1<<((i)&(NBBY-1))))
#define isset(a,i)      ((a)[(i)>>3] & (1<<((i)&(NBBY-1))))
#define isclr(a,i)      (((a)[(i)>>3] & (1<<((i)&(NBBY-1)))) == 0)

beastie ★★★★★
()
Ответ на: комментарий от beastie

Т.е. например:

#include <sys/param.h>

enum { a, b, c, d, e, f, g, h, i, k, l, m, n, o, p, r, s, nVal };
char mask[(nVal >> 3) + 1];

setbit(mask, n);
clrbit(mask, s);
isset(mask a);
/*...*/
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

Посмотри как QFLags устроен. Дюже удобная весчь, правда не уверен, что получиться без moc такое запилить.

pon4ik ★★★★★
()
union
{
  struct BitSet
  {
    uint32_t a :1;
    uint32_t b :1;
    uint32_t c :1;
    uint32_t reserved :29;
  };
  uint32_t u32;
};

как-то так. Давно таким извращением не занимался.

emulek
()
Ответ на: комментарий от BlackHawk
Days2 meetingDays = Days2.Tuesday | Days2.Thursday;

нарушает семантику, тип внезапно Days2, а

meetingDays == Days2.Tuesday

будет false, и у разработчика выпадут последние волосы в поисках отчего так

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

в следующий раз у тебя вылетит из головы unsigned? или while?

О, спасибо, прочитал про них. Намного упрощает написание программы, спасибо.

UVV ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Почему это нарушает? «Вторник или четверг» != «Вторник». Можно завести отдельную константу в enum, TuesdayOrThursday = Tuesday | Thursday, и тогда все сойдется.

BlackHawk
()
Последнее исправление: BlackHawk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.