& Quot; Безопасный & Quot; способ добавить элемент в std :: vector за пределами его размера (), но под его емкостью ()

Это может звучать опасно, но я пытаюсь сделать что-то вроде этого:

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, то, что я хотел бы избежать любой ценой).

Большое спасибо за вашу помощь.

-2

Решение

Вы не можете получить доступ к 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 в зависимости от размера объекта.

2

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

Других решений пока нет …