注意:性能在我的应用中非常关键! 为最坏情况分配足够的缓冲存储是避免重新分配的必要条件。
看看这个,我通常使用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 +我自己的大小变量OR std :: vector + reserve + push_back + clear + size?
我不想让另一个大小变量浮动,但clear()函数很慢(线性时间),而push_back函数有边界检查的开销。我需要在每帧的常量时间内重置size变量,而不调用任何析构函数并以线性时间运行。 结论:我不想破坏我的旧数据,我只需要重置当前大小/当前数字插入元素变量每帧。
答案 0 :(得分:0)
如果表现至关重要,那么也许您应该尽可能地描述一切。
如果您可以确定事先不需要重新分配,那么使用您自己的大小变量会有所帮助(这就是您所做的事情 - 在没有检查的情况下递增currVectorSize
),但在这种情况下为什么要使用std::vector
什么?只需使用数组或std::array
即可。
否则(如果可能发生重新分配)你仍然需要将你的大小变量与实际的矢量大小进行比较,所以这与push_back
几乎完全相同,并且不会为你带来任何好处。
还有一些vector
的调整/优化实现,例如folly::fbvector
,但你应该仔细考虑(并再次说明)你是否需要这样的东西。
至于清除向量,请查看vector::resize
- 如果您正在调整大小(由于迭代器失效),实际上保证不会重新分配。因此,您可以致电resize(0)
而不是clear
,以确定。