Мне нужно создать двустороннее сопоставление от целых к объекту. Я не могу использовать boost::bimap
потому что мои объекты модифицируются после помещения в отображение (они изменяются способами, которые не влияют на отображение).
Простое решение — использовать два vector
и unordered_map
:
vector<MyClass> _vector;
unordered_map<MyClass, size_t> _map;
Тем не менее, это поддерживает две копии каждого MyClass
и я не хочу этого
Я могу держать MyClass *
указатели в одном из контейнеров, и использовать хранилище другого, но я боюсь либо vector
или же unordered_map
может перемещать экземпляры (при перераспределении вектора или изменении размера хеш-таблицы).
Любая помощь будет оценена.
И вы не можете просто сохранить свои объекты в одном векторе и сохранить сопоставленные индексы в другом?
std::vector<MyClass> vC;
std::vector<unsigned int> vM;
затем vC[vM[i]]
это сопоставленный класс vC[i]
объект.
Хотя, если вы дадите более подробную информацию о том, что вы пытаетесь сделать (является ли карта рефлексивной? Все классы имеют сопоставленный класс или только некоторые? Как часто вам нужно модифицировать ваши объекты?), Мы могли бы помочь немного больше.
Вы можете использовать std::shared_ptr<MyClass>
в вашем основном контейнере, и std::weak_ptr<MyClass>
в ссылочной.
К сожалению, вы не дали достаточно контекста или требований, чтобы дать вам краткий пример. В любом случае, у вас также должно быть некоторое управление синхронизацией, которое удаляет записи из ссылочного контейнера, как только они удаляются из основного контейнера, хотя std::weak_ptr
делает это проще для реализации.
Это не только более эффективно использует память, но и освобождает вас от сохранения не связанных между собой копий MyClass
в синхронизации.