LINUX.ORG.RU

[C/C++]отношение один к одному


0

1

Что-то сегодня голова совсем не варит. Не могу вспомнить ни одной реализации подобной связи. Есть мысль использовать std::map (ну или QMap), но вроде как придется в обратную сторону все перебирать вкруговую (т.е. если нам необходимо получить значение <key> по имеющемуся <value>).
Прошу прощения, если не очень понятно выразился.

Как видно в проекте, кроме С++ STD lib используется еще и Qt. Никаких других библиотек тянуть не хотелось бы.

★★★★★
Ответ на: комментарий от Viglim

Только у нее поиск вроде как уже не O(ln(n)), или гоню?

Еще как варант ТС-у можно предложить держать 2 мапа, по 1 в каждом направлении, и ручками поддерживать их когерентное состояние, правда тогда уже по хорошему надо оборачивать value в обьекты обеспечивающие единичную копию данных с подсчетом ссылок, тобишь в tr1::shared_ptr

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

Насчет 2-х мапов уже думал. Только памяти уйдет в 2 раза больше, а это все для embeded, так что с лишней памятью там не особо.

trex6 ★★★★★
() автор топика

Два мапа, в качестве значения хранить указатель на элемент во втором map'е. Изврат + получается 2 указателя на пару, но ничего лучше придумать сходу не могу.

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

К сожалению, ради одного Bimap'а такую огромную библиотеку добавлять в проект совсем не хочется. Может быть есть что-то более легкое?

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

Может оказаться, что всё не так страшно. Оно разве не header-only?

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

> в качестве значения хранить указатель на элемент во втором map'е

по яйцам надо за такое бить

anonymous
()
Ответ на: комментарий от trex6

> К сожалению, ради одного Bimap'а такую огромную библиотеку добавлять в проект совсем не хочется. Может быть есть что-то более легкое?

Не факт, что оно будет намного тяжелее stl'овских контейнеров.

runtime ★★★★
()

В С делают просто.
Один объект - пара <key,value> помещается сразу в две мапы - в одну для сортировки по ключу, в другую - для сортировки по значению.
Наподобие:
struct _my_pair {
struct _rbtree_entry key_tree_entry;
struct _rbtree_entry value_tree_entry;
struct _key key;
struct _value value;
};
Ну а далее осталось реализовать функции по вставке, удалению, поиску и т.д., короче например см. linux-2.6.35/include/linux/rbtree.h и linux-2.6.35/lib/rbtree.c или любую другую реализацию красно-черного дерева.
По скорости - не хуже std::map, по памяти - лучше.
Вообще, такой подход позволяет запихнуть один объект во много разных спиков и мап.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.