考虑如下的代码输出:
int N = 100;
vector<int> v;
set<int> s;
for (int i = 0; i < N; ++i)
{
s.insert(v.capacity());
v.push_back(i);
}
for (auto& e : s)
cout << e << " ";
cout << endl;
可以看到空间的变化是0,1,2,4,8,16,…,128.(注:GCC 编译器是如此,vc 不是,二者提供了不同的 vector 实现)。
这就需要考虑到当空间不足时,需要开辟新的内存并且发生元素的copy(原始空间的释放). 一般情况下(GCC)开辟的空间是原来的2倍。那么平均的添加时间是:
1N(1+2+4+⋯+2log⌈N⌉)
log 为以二为底的对数, ⌈⌉ 表示向上取整;
平均下来依旧是O(N)。