Это может звучать опасно, но я пытаюсь сделать что-то вроде этого:
std::vector<StructureSlowToBeCreated> vElems;
StructureSlowToBeCreated s1, s2;
vElems.reserve(many_slots_for_structs);
vElems[x1] = s1; // I can ensure x1, x2 < many_slots_for_structs
vElems[x2] = s2;
По сути, идея состоит в том, чтобы избежать использования
vElems.resize(many_slots_for_structs);
Поскольку оба s1 а также s2 создаются медленно, поэтому я не хочу делать это дважды. Как я уже сказал, я могу на 100% обеспечить x1 а также x2 будут в векторе вместимость границы, но также много раз, конечно, за пределами размер границы (следовательно, используя «в()» в конечном итоге в исключении).
Есть ли более чистый способ сделать это? Или я должен считать это достаточно чистым (я чувствую, что это не так).
И мне действительно нужно разместить s1 на x1 индекс, в противном случае, мне нужно хранить x1 в качестве параметра s1 и сохранить вторичную карту для ссылки x1 с позиции s1 в векторе (и я бы добавил стоимость просмотра карты при каждом доступе к s1 или же s2, то, что я хотел бы избежать любой ценой).
Большое спасибо за вашу помощь.
Вы не можете получить доступ к std :: vector выше его размера. Может показаться, что работает, но это UB и это создаст проблемы в конце.
Обычный способ выполнить эту задачу — использовать карту, чтобы вы могли создавать только те элементы, которые вам нужны. Однако нахождение n-го элемента — это O (logn) вместо постоянного времени для std :: vector.
std::map<size_t, StructureSlowToBeCreated> myMap;
Если вам действительно нужен постоянный доступ, вы должны изменить размер вектора. Я понимаю, что вы не хотите создавать по умолчанию все элементы, потому что это трудоемкая операция. Затем вы можете создать std :: vector из других элементов, которые хранят ваш объект. Например:
std::vector<std::optional<StrSlowToBeCreated>> myVec; // as suggested by GManNickG
std::vector<std::unique_ptr<StructureSlowToBeCreated>> myVec;
Возможно, вы можете выбрать между option и unique_ptr в зависимости от размера объекта.
Других решений пока нет …