1

我正在开发基于 QT 的应用程序,我需要在动态(QVector)中使用向量。在检查向量的大小时,这比它应该的要高,我用 STL 向量进行了测试,结果是一样的。下面我介绍 STL 向量问题的代码。这种情况使我们无法知道向量的实际大小并正确使用它。怎么修?。谢谢您的帮助。

  • 编译器:GCC 4.5.2
  • 操作系统:Linux Ubuntu 11.04
  • 观察:向量的容量或大小总是以 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
4

2 回答 2

4

您所看到的是std::vector的扩展能力。他们为使其在一般情况下更快地工作而采取的措施之一是保留比所需更多的内存,这样它就不必在每次使用时都保留内存push_back

如您所见,保留的越多,保留的越多。capacity是告诉你这个数量的函数。您可以使用reserve. 它将告诉向量要保留多少内存,然后capacity如果没有进行任何操作(这可能会导致保留内存的另一次更改),则将检索该数字。reserve如果您要处理push_back大量元素并且您希望向量只保留一次足够的内存,而不是自动保留多少次,这通常很有用。

您要查找的函数是size,它为您提供向量中的元素数量。与 this 相关联的resize函数reservecapacity。也就是说,当你调用 时resize (10),如果你之前有 5 个元素,你将获得 5 个默认初始化的新元素,并size返回 10。

于 2012-06-19T00:56:17.493 回答
0

你为什么感兴趣capacity?您是否专注于内存使用?否则不需要容量方法,您只需要关心大小即可。

如果我们谈论的是容量细节,容量如何变化取决于供应商的实施。您根据 2 的幂重新分配数组的事实可能并不适用于所有情况:例如,我已经看到一些实现按 150% 的比例缩放,而不是 200%。

capacity通常会大于大小,有时会大得多(例如:元素数量的两倍)。这是因为向量是可增长的、连续的序列(它们是基于数组的)。如果您完全关心性能,那么您最不想做的就是让每个 push_back/insert/erase 触发内存分配/释放,因此 vector 通常会创建一个大于后续插入所需的数组。还值得注意的是,该clear方法不一定会对容量产生任何影响,您可能需要查看收缩适应习语 ( http://www.gotw.ca/gotw/054.htm )。

如果您想对容量进行绝对控制以达到完美契合,您可以利用预留方法提前分配特定容量。但是,如果您可以提前预测将要放入向量中的元素数量,那只会很有效。

于 2012-06-19T01:08:50.790 回答