【发布时间】:2017-05-04 20:56:45
【问题描述】:
这听起来可能很危险,但我正在尝试做这样的事情:
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 边界(因此,使用 "at()" 会导致异常)。
有没有更清洁的方法来做到这一点?或者我是否应该认为这个足够干净(我感觉它不是)。
我确实需要将 s1 放在 x1 索引处,否则,我需要将 x1 存储为 x1 的参数strong>s1 并存储辅助地图以将 x1 与矢量中 s1 的位置联系起来(我会添加查看地图的成本每次访问 s1 或 s2,我想不惜一切代价避免)。
非常感谢您的帮助。
【问题讨论】:
-
我认为有很多关于如何使用向量的示例和参考资料。是的,有一个更清洁的方式,因为你的方式是一个错误。
-
如何使用
reserve和push_back或emplace_back? -
要么使用
emplace_back以避免无意义的构造,修复你的类以使其构造不会那么慢,或者使用std::vector<std::optional<X>>(或boost::optional)懒惰地构造实际元素。 -
或者使用地图,或者类似的容器。
-
@NeilButterworth:好点,我错过了一些关于这些需要如何在特定索引上的内容。听起来“嘿,我的容器不支持这个”可能是您使用错误的一个很好的指标。