这可能听起来很危险,但我试图做这样的事情:
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 时查看地图,我想不惜一切代价避免这种情况。)
非常感谢你的帮助。
答案 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之间进行选择。