"安全"将一个元素添加到超出其大小()但在其容量()下的std :: vector的方法

时间:2017-05-04 20:56:45

标签: c++ vector size 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);

由于 s1 s2 的创建速度很慢,因此我不想两次这样做。正如我所说的,我可以100%确保 x1 x2 将位于vector capacity 边界内,但也可以在 size 边界(ergo,使用&#34; at()&#34; 最终会出现异常)。

有更清洁的方法吗?或者我应该认为这个足够干净(我感觉它不是)。

我确实需要将 s1 放在 x1 索引处,否则,我需要将 x1 存储为参数 s1 并存储辅助地图以将 x1 s1 的位置关联起来(并且我添加了成本在每次访问 s1 s2 时查看地图,我想不惜一切代价避免这种情况。)

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您无法访问超过其大小的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;

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