"Safe" 将元素添加到 std::vector 的方法超出其 size() 但低于其 capacity()

"Safe" way to add an element to a std::vector beyond its size() but under its capacity()

这听起来可能很危险,但我正在尝试做这样的事情:

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);

由于 s1s2 的创建速度都很慢,所以我不想做两次。正如我所说,我可以 100% 确保 x1x2 将在向量 capacity 内边界,而且很多时候肯定在 size 边界之外(因此,使用 "at()" 将以异常结束)。

有没有更简洁的方法来做到这一点?或者我应该认为这个足够干净(我感觉不够干净)。

而且我确实需要将 s1 放在 x1 索引处,否则,我需要存储 x1 作为 s1 的参数,并存储一个辅助映射到 link x1 位置为 s1 在向量中(我会在每次访问 s1s2 时添加查看地图的成本,我想不惜一切代价避免的事情)。

非常感谢您的帮助。

您无法访问超过其大小的 std::vector。它可能看起来有效,但是 it is 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;

可能,您可以根据对象大小在可选和 unique_ptr 之间进行选择。