LINUX.ORG.RU

[c++] структура данных типа ассоциативного массива

 


0

2

Привет.

Ищу структура данных, которая делала бы отображение не только ключ->значение, но одновременно и значение->ключ, т.е. я завожу объект, забиваю его уникальными парами ключ-значение и могу получить как ключ по значению, так и значение по ключу.

Интересуют готовые решения из std, Qt или небольшой внешней библиотеки. БД не предлагать :)

★★★★★

Последнее исправление: staseg (всего исправлений: 1)

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

Вроде нет. Ок, как называется такая структура данных безотносительно к конкретным языкам?

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

в бусте такое есть

Как оно называется в бусте? Попробую найти аналог или оттуда вытащить.

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

map и есть.

Такой структуры данных нет, есть ассоциативный массив, и он не обладает свойством find value => key.

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

а ты заведи 2 массива
один
massiv -> значение
а второй
значение -> массив

и каждое добавление - сначале добавляй и в первый и второй массив
и удаление - удаляй сначала из второго - а потом из первого
ну и организовать это в мелкий класс

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

а ты заведи 2 массива

Ну да, я представляю как это сделать самому, интересует то стандартное решение.

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

Ну да, я представляю как это сделать самому, интересует то стандартное решение.

И дублировать данные не хочется. В правильной реализации храниться должен только один набор пар и по хешу или дереву на ключ и значение. Наверное.

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

WHAT

const T QMap::value ( const Key & key ) const

pair<const_iterator,const_iterator> std::map::equal_range ( const key_type& x ) const;

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

boost multiindex

Ковырял этот мультииндекс и нашел как называется искомая структура: Bidirectional map, в бусте есть реализация, называется bimap, основывается она на мультииндексе или нет - еще не смотрел.

PS. смотрел примеры использования multiindex, количеством пользовательского кода как-то не вдохновлен :(

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

Не встречал таких «стандартных» решений. Может быть, по той простой причине, что нужно гарантировать не только уникальность ключей, но и уникальность значений, а такое условие нельзя облечь в форму кода.

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

Если же значения могут повторятся, то тут надо думать, но по-моему в том же Си++ есть структура (давно не писал на них) с возможностью задавать повторяющиеся ключи. Но, кажется, у тебя взаимно-однозначное отображение. Так что, не твой случай :)

dave ★★★★★
()

А, ну да. В качестве предупреждения. Multiindex может быть неэффективен, если рассчитан на общий случай, когда значения повторяются.

dave ★★★★★
()

Всем спасибо. Свелосипедил решение на двух map-ах.

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

bimap требует существенно меньше пользовательского кода, чем multiindex.

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