我正在开发基于QT的应用程序,我需要在动态(QVector)中使用向量。当检查向量的大小时,这比它应该高,我用STL向量测试,结果是相同的。下面我给出了STL向量的问题代码。这种情况使我们无法知道向量的实际大小并正确使用它。怎么修?。谢谢你的帮助。
代码是:
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
答案 0 :(得分:4)
你所看到的是std::vector
的扩展能力。在一般情况下,它们使其更快地工作的一个原因是保留了比所需内存更多的内存,因此每次使用push_back
时都不必保留内存。
正如你所看到的,越多越保留它。 capacity
是告诉您此金额的函数。您可以使用reserve
来测试此理论。它会告诉向量要保留多少内存,如果没有进行任何操作,capacity
将检索该数字(这可能导致保留内存的另一个更改)。 reserve
通常非常有用,如果您即将push_back
大量元素,并且您希望向量仅保留足够的内存一次,而不是自动保留多次。
您正在寻找的功能是size
,它可以为您提供向量中的元素数量。与此相关联的函数为resize
,reserve
为capacity
。也就是说,当你致电resize (10)
时,如果你之前有5个元素,你将获得5个默认初始化的新元素,size
返回10。
答案 1 :(得分:0)
你为什么对capacity
感兴趣?你是专注于内存使用?否则不需要容量方法,您只需关注自己的大小。
如果我们谈论容量细节,那么容量的变化将取决于供应商的实施。您基于2的幂重新分配数组的事实可能不适用于所有情况:例如,我已经看到一些实现按比例缩放150%,而不是200%。
capacity
通常大于大小,有时甚至更大(例如:元素数量的两倍)。这是因为载体是可生长的,连续的序列(它们是基于阵列的)。如果你完全关心性能,那么你想要的最后一件事就是每次push_back / insert / erase都会触发内存分配/释放,因此vector通常会创建一个比后续插入所需的更大的数组。值得注意的是,clear
方法不一定会影响容量,您可能希望查看缩小到适合的习惯用法(http://www.gotw.ca/gotw/054.htm)。
如果您想要对容量进行绝对控制以便完美匹配,则可以使用预留方法提前分配特定容量。这只会很好,但如果你能提前预测你将要放入矢量的元素数量。