CArray 和内存预分配

CArray and memory pre-allocation

我正在使用 MFC 项目中的代码,该项目使用 CArray class 来处理动态数组。它是这样工作的:

CArray<CUSTOM_STRUCT> arr;
while(some_criteria)
{
    CUSTOM_STRUCT cs;
    add.add(cs);
}

这种方法可行,但在向动态数组添加大量内容时变得非常慢。所以我很好奇,有没有办法在我开始调用 add() 方法之前在 CArray 中预分配内存?

不过有一点需要注意。在我进入我的 while() 循环之前,我只能估计数组中元素的大概数量。

PS。除了 CArray,我不能使用任何其他数组。

PS2。由于此项目的复杂性,我更愿意通过 add() 方法向数组添加内容。

真的,真的考虑换一个 std::vector。出乎意料的简单。

这是尝试让 CArray 遵循类似 std::vector 的增长政策,而不是每次都增长 1:

CArray<CUSTOM_STRUCT> arr;
while(some_criteria) {
  CUSTOM_STRUCT cs;
  arr.SetSize( arr.GetSize(), 1 + arr.GetSize()/2 );
  arr.add(cs);
}

当我运行遇到这个问题时,我用std::vector替换了CArray,所以我没有测试上面的内容。阅读文档,它应该工作。测试它,看看你是否获得了巨大的性能提升(它应该从 O(n^2) 下降到 O(n) 摊销)。

使用CArray::SetSize()方法预分配内存。

请注意,如果内存是预分配的,您应该使用 CArray::operator[] 而不是 CArray::Add 方法。