"Safe"将元素添加到 std::vector 的方法,超出了其 size() 但低于其容量 ()
"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);
由于 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进行选择。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 具有非整数边容量的最大流量的Dinic算法
- 将stl字符串缩小到小于15个字符的容量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 在容量内调整矢量大小时的性能影响
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- std::vector的容量会降低吗?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 可视化C++载体:未使用的容量
- 如何在 c++ 中清除矢量容量?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- "Safe"将元素添加到 std::vector 的方法,超出了其 size() 但低于其容量 ()