gpt4 book ai didi

c++ - 使用 vector 和 QVector 进行奇怪的内存管理

转载 作者:行者123 更新时间:2023-11-30 02:04:04 25 4
gpt4 key购买 nike

我正在开发基于 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,因为 reservecapacity。也就是说,当你调用resize(10)时,如果你之前有5个元素,你将获得5个默认初始化的新元素,而size返回10。

关于c++ - 使用 vector 和 QVector 进行奇怪的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com