C++ 具有反向和弹出/回推成本的STL向量

C++ 具有反向和弹出/回推成本的STL向量,c++,stl,C++,Stl,我不太擅长计算算法成本,所以我在这里问 以下是一个初始初始化为1000个元素的向量: vector<unsigned int> mFreeIndexes(1000); 向量mfreeindex(1000); 我将不断地将元素弹出/推回到向量,但绝不会将元素推回超过1000(因此绝不会强制向量重新分配) 在这种情况下,PopeSkP/Purth-Boop-Office运算是O(1)或O(n)</P>< P>从C++标准23.3.7.5: 无效推回(常数T&x) 无效推回(T&x)

我不太擅长计算算法成本,所以我在这里问

以下是一个初始初始化为1000个元素的向量:

vector<unsigned int> mFreeIndexes(1000);
向量mfreeindex(1000);
我将不断地将元素弹出/推回到向量,但绝不会将元素推回超过1000(因此绝不会强制向量重新分配)


在这种情况下,PopeSkP/Purth-Boop-Office运算是O(1)或O(n)</P>< P>从C++标准23.3.7.5:

无效推回(常数T&x)

无效推回(T&x)

备注:如果新容量大于旧容量(…),则会导致重新分配

请注意,它并没有说它不能在其他场景中重新分配,但这将是该标准的一个非常不寻常的实现。我认为您可以放心地假设,当仍有容量时,
push_back
不会重新分配

使用
pop_back
的事情有点复杂。该标准没有在
pop_back
上下文中说明任何关于重新分配的内容。但是,
pop_back
不重新分配似乎是一种常见的实现(没有已知的例外)。不过有一些保证,请参见以下内容:


不管怎样,只要不超过预定义的大小,您就可以安全地假设没有发生重新分配,并且复杂性确实是O(1)。

只要没有执行重新分配,它应该是O(1)。当您
推回时
将元素添加到向量中。在上面的定义之后,如果您这样做,例如
mfreeindex.push_back(1)那么向量将有1001个元素。也许您需要该功能?此问题已在中得到回答。如果容量从未用完,则无需重新分配,并且推送和弹出操作应保持不变(在您的情况下,没有进行自定义复制或移动构造/分配)。操作基本上只需要增加或减少大小,对于push,它将复制值。A
push\u back
到向量的平均值为O(1)。我只是想补充一点,一个
向量
push_back()
pop_back()
使用率几乎是你能得到的最快的堆栈:你的内部循环中不会有任何内存分配,它提供了很好的缓存局部性(迭代器和引用)无效保证防止在容量不变的情况下重新分配。@Caleth我在标准中找不到这些保证。不适合流行音乐。仅用于擦除。Pop在功能上可能是从erase派生的,但我也找不到。