我正在开发基于 QT 的应用程序,我需要在动态 (QVector) 中使用 vector 。当检查 vector 的大小时,这比它应该的要高,我用 STL vector 测试,结果是一样的。下面我用代码展示了STL vector 的问题。这种情况使我们无法知道 vector 的实际大小并正确使用它。怎么修?。感谢您的帮助。
- 编译器:GCC 4.5.2
- 操作系统:Linux Ubuntu 11.04
- 观察: vector 的容量或大小总是以 2 为底的幂
代码是:
double PI = 3.1415926536, delta = PI/(100/2);
vector<double> A(0);
vector<double> B(0);
cout<<"Capacity A = "<<A.capacity()<<"; Capacity B = "<<B.capacity()<<endl;
for (int i = 0; i < 100; i++) {
A.push_back(i*delta);
B.push_back( sin( A[i] ) );
cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}
for (int i = 0; i < A.capacity(); i++) {
cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}
cout<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
输出是:
Capacity A = 0; Capacity B = 0
A(0) = 0; B(0) = 0 Size A = 1; Size Y = 1
A(1) = 0.0628319; B(1) = 0.0627905 Size A = 2; Size B = 2
A(2) = 0.125664; B(2) = 0.125333 Size A = 4; Size B = 4
A(3) = 0.188496; B(3) = 0.187381 Size A = 4; Size B = 4
.
A(99) = 6.22035; B(99) = -0.0627905 Size A = 128; Size B = 128
.
A(126) = 0; B(126) = 1.31947 Size A = 128; Size B = 128
A(127) = 0; B(127) = 1.3823 Size A = 128; Size B = 128
Size A = 128; Size B = 128
最佳答案
您看到的是 std::vector
的扩展能力。在一般情况下,为了使其工作得更快,他们所做的其中一件事是保留比所需更多的内存,这样就不必在每次使用 push_back
时都保留内存。
如您所见,它越大,保留的越多。 capacity
是告诉您这个数量的函数。您可以使用 reserve
来测试这个理论。它将告诉 vector 要保留多少内存,之后如果没有进行任何操作,capacity
将检索该数字(这可能会导致保留内存发生另一次变化)。 reserve
通常在您要push_back
大量元素并且您希望 vector 只保留一次足够的内存而不是多次保留时很有用自动。
您要查找的函数是 size
,它会为您提供 vector 中元素的数量。与此关联的函数是 resize
,因为 reserve
是 capacity
。也就是说,当你调用resize(10)
时,如果你之前有5个元素,你将获得5个默认初始化的新元素,而size
返回10。
关于c++ - 使用 vector 和 QVector 进行奇怪的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092998/