我应该使用 std::vector + 我自己的大小变量吗?

Should I use std::vector + my own size variable or not?

注意:性能在我的应用程序中非常关键! 为最坏的情况分配足够的缓冲区存储是避免重新分配的要求。

看看这个,我平时就是这样用的std::vector:

//On startup...
unsigned int currVectorSize = 0u;
std::vector<MyStruct> myStructs;
myStructs.resize(...); //Allocate for the worst case scenario!

//Each frame, do this.
currVectorSize = 0u; //Reset vector, very fast.

run algorithm...
//insert X elements in myStructs if condition is met
myStructs[currVectorSize].member0 = ;
myStructs[currVectorSize].member1 = ;
myStructs[currVectorSize].member2 = ;
currVectorSize++;

run another algorithm...
//insert X elements in myStructs if condition is met
myStructs[currVectorSize].member0 = ;
myStructs[currVectorSize].member1 = ;
myStructs[currVectorSize].member2 = ;
currVectorSize++;

Another part of the application uses myStructs and currVectorSize

我有一个决定问题,我应该使用 std::vector + resize + 我自己的大小变量还是 std::vector + reserve + push_back + clear + size?

我不喜欢让另一个大小变量浮动,但是 clear() 函数很慢(线性时间)并且 push_back 函数有边界检查的开销。我需要在每一帧的恒定时间内重置大小变量,而不需要在线性时间内调用任何析构函数和 运行。 结论:我不想破坏我的旧数据,我只需要重置当前 size/current 每帧插入元素变量的数量。

如果性能很重要,那么也许您应该尽可能地分析一切。

如果您可以确定事先不需要重新分配,则使用您自己的大小变量会有所帮助(这就是您所做的 - 递增 currVectorSize 而不进行检查),但在这种情况下为什么要使用 std::vector 在所有?只需使用数组或 std::array

否则(如果可能发生重新分配)您仍然需要将您的大小变量与实际向量大小进行比较,因此这与 push_back 所做的几乎相同并且不会给您带来任何好处。

还有一些 vector 的 tweaked/optimized 实现,例如 folly::fbvector,但您应该仔细考虑(并再次说明)您是否需要类似的东西。

至于清除向量,请查看 vector::resize - 如果您正在调整大小(由于迭代器失效),它实际上保证不会重新分配。所以你可以调用 resize(0) 而不是 clear 只是为了确定。