Положить подмножество в map
От: Sashaka Россия  
Дата: 21.05.09 19:57
Оценка:
Допустим, есть некоторый, жестко заданный, набор уникальных идентефикаторов, представленный в виде перечисления:
enum SomeSet
{
   id1=0,
   id2,
   //...
   idN,
   max_id //обязательно присутствует, как ограничение
};


Допустим, я хочу привязать к этому набору, какие-то данные, например указатели на функции или интерфейсы, и потом удобно получать эти данные по идентефикатору. Для этого я кладу в std::map такие вот пары: pair<SomeSet,SomeData>, в общем обычная ситуация, имхо.

А теперь допустим я хочу класть в map не отдельные идентефикаторы, а непересекающиеся подмножества всего набора идентефикаторов и потом получать данные из map по одному идентефикатору из этого набора. Хотелось бы, чтобы все необходимое хранилось в ключе map, понятно что надо как-то определить для него класс с оператором сравнения, и парой конструкторов, один из который принимает (и запоминает) подмножество идентефикаторов а другой — отдельный идентефикатор. Но чето в голову не приходит как потом сравнивать эти ключи.

Или может меня не в ту сторону занесло?
Re: Положить подмножество в map
От: jazzer Россия Skype: enerjazzer
Дата: 22.05.09 00:04
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>А теперь допустим я хочу класть в map не отдельные идентефикаторы, а непересекающиеся подмножества всего набора идентефикаторов и потом получать данные из map по одному идентефикатору из этого набора. Хотелось бы, чтобы все необходимое хранилось в ключе map, понятно что надо как-то определить для него класс с оператором сравнения, и парой конструкторов, один из который принимает (и запоминает) подмножество идентефикаторов а другой — отдельный идентефикатор. Но чето в голову не приходит как потом сравнивать эти ключи.


S>Или может меня не в ту сторону занесло?


напиши функцию типа int subset(SomeSet s), которая будет для элемента возвращать номер его подмножества — она тебе все равно понадобится.
А в компараторе просто сравнивай то, что эта функция возвращает.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Положить подмножество в map
От: Кодт Россия  
Дата: 22.05.09 11:17
Оценка:
Здравствуйте, Sashaka, Вы писали:

<>

Можно сделать следующим образом: пусть диапазон ключей разбивается на поддиапазоны [k0,k1), [k1,k2), [k2,k3) и т.д., идущие встык.
Тогда возьмём упорядоченное множество левых границ {k0, k1, k2, k3, ...} — каждой левой границе соответствует свой диапазон.
Чтобы определить, в какой диапазон попадает искомый ключ k, нужен не просто двоичный поиск "вообще", а поиск нижней границы — lower_bound.

lower_bound(the set, k) <= k < upper_bound(the set, k)

Если k<k0, то lower_bound вернёт итератор на k0, нарушающий общее неравенство (k0 > k), поэтому нужна дополнительная проверка — помимо проверки на end.




Если поддиапазоны идут не встык, то можно
— либо создавать пары ключ->значение, соответствующее диапазонам, и ключ->пусто, соответствующие дыркам
— либо в роли ключа брать пару [левая,правая) границы диапазона и по-прежнему упорядочивать по левым границам, искать lower_bound и проверять — попал ли искомый ключ в найденный.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re: Положить подмножество в map
От: Sashaka Россия  
Дата: 22.05.09 17:49
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>Или может меня не в ту сторону занесло?


Всем спасибо, задача была решена "в лоб". дублированием значений в map. Поскольку в качестве данных у меня указатели, размер набора идентефикаторов относительно невелик (десятки), считаю — покатит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.