具有反向成本和pop / push_back成本的STL向量

Avi*_*hol 5 c++ stl

我不能很好地算出算法成本,所以我在这里问。

这是一个初始使用1000个元素初始化的向量:

vector<unsigned int> mFreeIndexes(1000);
Run Code Online (Sandbox Code Playgroud)

我将持续将pop_back / push_back元素添加到向量中,但绝不会将push_back超过1000个(因此绝不要强迫向量重新分配)。

在这种情况下,pop_back / push_back操作是O(1)还是O(n)?

fre*_*ish 4

来自 C++ 标准 23.3.7.5:

无效push_back(const T& x);

无效push_back(T&& x);

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

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

事情pop_back有点复杂。该标准没有提及上下文中的重新分配pop_back。但这似乎是一个常见的实现(没有已知的例外)pop_back重新分配的常见实现(没有已知的例外)。不过有一些保证,请参阅:

pop_back() 可以减少向量的容量吗?(C++)

无论如何,只要您不超过预定义的大小,您就可以安全地假设不会发生重新分配,并且复杂性确实为 O(1)。