[面试] C++ STL(一)—— 向一个vector中添加N个元素,平均的添加的性能是?
2016-03-28 09:38
399 查看
考虑如下的代码输出:
可以看到空间的变化是0,1,2,4,8,16,…,128.(注:GCC 编译器是如此,vc 不是,二者提供了不同的 vector 实现)。
这就需要考虑到当空间不足时,需要开辟新的内存并且发生元素的copy(原始空间的释放). 一般情况下(GCC)开辟的空间是原来的2倍。那么平均的添加时间是:
1N(1+2+4+⋯+2log⌈N⌉)
log 为以二为底的对数,⌈⌉ 表示向上取整;
平均下来依旧是O(N)。
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)。