словарь — двустороннее отображение с эффективным использованием памяти в переполнении стека

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

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

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

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

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

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

-2

Решение

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

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

затем vC[vM[i]] это сопоставленный класс vC[i] объект.

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

1

Другие решения

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

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

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

0

По вопросам рекламы [email protected]