Допустим, есть некоторый, жестко заданный, набор уникальных идентефикаторов, представленный в виде перечисления:
enum SomeSet
{
id1=0,
id2,
//...
idN,
max_id //обязательно присутствует, как ограничение
};
Допустим, я хочу привязать к этому набору, какие-то данные, например указатели на функции или интерфейсы, и потом удобно получать эти данные по идентефикатору. Для этого я кладу в std::map такие вот пары: pair<SomeSet,SomeData>, в общем обычная ситуация, имхо.
А теперь допустим я хочу класть в map не отдельные идентефикаторы, а непересекающиеся подмножества всего набора идентефикаторов и потом получать данные из map по одному идентефикатору из этого набора. Хотелось бы, чтобы все необходимое хранилось в ключе map, понятно что надо как-то определить для него класс с оператором сравнения, и парой конструкторов, один из который принимает (и запоминает) подмножество идентефикаторов а другой — отдельный идентефикатор. Но чето в голову не приходит как потом сравнивать эти ключи.
Или может меня не в ту сторону занесло?
Здравствуйте, 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>>