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

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

本文关键字:容量 size 于其 添加 元素 Safe std 方法 vector      更新时间:2023-10-16

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

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 将在向量容量边界内 size 边界(ergo,使用" at((" 最终会出现。

有什么干净的方法可以做到这一点?还是我应该认为这是足够干净的(我觉得不是(。

我真的需要将 s1 放在 x1> x1 索引上strong> S1 并将辅助地图存储到链接 x1 的位置 s1> s1 在向量中(我会添加查看地图的成本每次访问 S1 S2 ,我想不惜一切代价避免使用(。

非常感谢您的帮助。

您无法访问其大小高于其大小的std ::向量。它似乎有效,但它是UB,最终会产生问题。

执行此任务的正常方法是使用地图,以便仅创建所需的元素。但是,找到第n个元素是o(logn(,而不是std :: vector的恒定时间。

std::map<size_t, StructureSlowToBeCreated> myMap;

如果您确实需要持续不断的时间访问,则必须调整向量大小。我知道您不想默认构造所有元素,因为这是一个耗时的操作。然后,您可以创建存储对象的其他元素的std ::向量。例如:

std::vector<std::optional<StrSlowToBeCreated>> myVec; // as suggested by GManNickG
std::vector<std::unique_ptr<StructureSlowToBeCreated>> myVec;

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