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

标签 c++ qt

我正在开发基于 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/

相关文章:

c++ - QTimer 不发出超时信号

C++ 类型和 OOP 子类

C++按值传递数组导致段错误

c++ - Qt的QFontMetrics::horizo​​ntalAdvance()在代码编辑器实现中丢失

c++ - 编译 C 代码,看不到 #define 常量

qt - Qt 中 setVisble 后不要立即重新绘制

C++:在嵌套名称说明符中命名的不完整类型

c++ - 指针和 "NULL"

c++ - Qt - 如何在 QLineEdit 中添加上标和下标?

qt - QML 信号执行两次