2015-02-12 3 views
-2

Мне нужно создать двустороннее сопоставление от ints к объекту. Я не могу использовать boost::bimap, потому что мои объекты изменяются после размещения в сопоставлении (они изменяются способами, которые не влияют на отображение).Эффективное двунаправленное сопоставление памяти в C++

Простое решение состоит в использовании два vector и unordered_map:

vector<MyClass> _vector; 
unordered_map<MyClass, size_t> _map; 

Однако, это поддерживает две копии каждого MyClass, и я не хочу этого.

я могу держать MyClass * указатели в одном из контейнеров, а также использовать для хранения другого, но я боюсь, что либо vectorunordered_map или могут перемещать экземпляры вокруг (при перераспределении вектор, или изменение размера хэш-таблицу).

Любая помощь будет оценена по достоинству.

+0

Как бы вы справились с удалением из вектора, или вы не позволите этого? – Barry

+2

Я бы сказал, что это 'std :: shared_ptr ' для. –

+1

Документация boost :: bimap говорит, что вы можете изменять вещи, которые не влияют на отображение, в некоторых настройках бимапа, возможно, –

ответ

0

Вы можете использовать std::shared_ptr<MyClass> в своем основном контейнере, а std::weak_ptr<MyClass> в ссылочном.

К сожалению, вы не дали достаточного контекста или требований, чтобы дать вам краткий пример. В любом случае, вы также должны иметь некоторое управление синхронизацией, которое удаляет записи из контейнера ссылок, как только они удаляются из основного контейнера, хотя std::weak_ptr упрощает реализацию.

Не только это более эффективно с точки зрения памяти, но и освобождает вас от синхронизации не связанных друг с другом копий MyClass.

1

И не можете ли вы просто сохранить свои объекты в одном векторе и сохранить отображаемые индексы в другом?

std::vector<MyClass> vC; 
std::vector<unsigned int> vM; 

Тогда vC[vM[i]] это отображается класс vC[i] объекта.

Хотя, если вы даете более подробную информацию о том, что вы пытаетесь сделать (это рефлексивная карта? Все классы имеют сопоставленный класс или просто некоторые? Как часто вам нужно изменять свои объекты?), Мы могли бы помочь немного больше.

 Смежные вопросы

  • Нет связанных вопросов^_^