Я создаю несколько индексов (то есть, которые используют разные ключи) в большой набор объектов. Объекты могут меняться, и коллекция может сокращаться и расти. Мои мысли до сих пор:
Сохранять несколько наборов указателей на объекты. Используйте вместо использования карту вместо лучшей инкапсуляции. Используйте unordered_set для масштабирования с большими наборами данных. В идеале указатели должны быть в какой-то форме умным указателем.
Я могу начать довольно легко с мастер-коллекции unique_ptrs, которые управляют всеми выделениями и вторичными индексами, использующими "необработанные" указатели (на данный момент я оставлю вспомогательные функции, но обратите внимание, что индекс является multiset, поскольку его ключ не будет уникальным по всему набору):
typedef boost::unordered_set< boost::unique_ptr<MyObject>,myobject_hash,myobjects_equal > MyObjects;
typedef boost::unordered_multiset<const MyObject*,myobject_index2_hash,myobject_index2_equal > MyObjectsIndex2;
Использование прост:
MyObjects my_objects;
MyObjectsIndex2 my_objects_index2;
auto it_mo = my_objects.insert(
boost::unique_ptr<MyObject>(
new MyObject(...)
)
);
const MyObject* p_mo = it_mo.first->get();
my_objects_index2.insert(p_mo);
Я рассматриваю возможность приложить дополнительные усилия, чтобы заменить использование индексов исходными указателями на ссылки со ссылками на уникальные_трассики основной коллекции. Я не уверен, что могу, хотя, по крайней мере, не легко. Я думал, что спрошу, если кто-то еще отправился на этот маршрут или предложил альтернативные варианты.
UPDATE
Извлеченные уроки:
- Класс Datastore классный
- reference_wrappers классные
- xx_set с элементом "datastore" объекта "ключ" более экономичен по площади, чем xx_map. НО... вы не можете легко использовать unique_ptr как ключ в С++ 11. С++ 14, по-видимому, может улучшить функциональность с помощью
std::set<Key>::find
. Подробнее см. здесь. Итак, на данный момент хранилище данных, которое управляет распределением ресурсов, кажется, имеет больше смысла здесь, чем попытка принудительно использовать unique_ptr в качестве заданного ключа или увеличение хранилища ключей с картами. - Не забудьте заставить значения ключа быть константными для жизни объекта (используйте значения const, указанные в конструкторе)