是否存在使用大小初始化矢量的性能原因?
例如vector<myClass> v(10);
而不是vector<myClass> v
和push_back根据需要?
答案 0 :(得分:3)
vector<myClass> v(10)
预先分配内部数组,并使用10个默认构造的myClass
对象自动填充它。
vector<myClass> v
没有预先分配数组,但您可以使用reserve()
和resize()
。
push_back()
超过当前size()
时, capacity()
将重新分配和复制内部数组。
答案 1 :(得分:2)
如果push_back()
将向量增加到当前capacity()
之后,它将重新分配其数组,这是无效的。
所以,如果你告诉向量确切地要存储多少元素,那么你不需要支付重新分配向量的成本,特别是如果向量必须改变内存中的位置(因为它不会适合它的位置,因此它自己复制(额外费用!)。
但你相信我吗?也许。你 应该相信事实:
测试代码
#include <vector>
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
int main() {
const int N = 1000000;
using namespace std::chrono;
{
// push_back only
high_resolution_clock::time_point t1 = high_resolution_clock::now();
vector<int> v1;
for(int i = 0; i < N; ++i)
v1.push_back(i);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
}
{
// set size and use operator []
high_resolution_clock::time_point t1 = high_resolution_clock::now();
vector<int> v2(N);
for(int i = 0; i < N; ++i)
v2[i] = i;
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
}
return 0;
}
输出
It took me 0.0170491 seconds.
It took me 0.00236058 seconds.
正如您所看到的,实验结果表明,通过设置矢量的大小,我们可以快一个数量级。