CArray和内存预分配

时间:2015-03-19 19:49:38

标签: c++ mfc dynamic-arrays

我正在使用MFC项目中的代码,该项目使用CArray类来处理动态数组。它的工作原理如下:

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

这种方法很有效,但随着动态数组的大量增加,它变得非常慢。所以我很好奇,有没有办法在我开始调用add()方法之前在CArray中预先分配内存?

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

PS。我不能使用除CArray之外的任何其他数组。

PS2。由于此prokect的复杂性,我宁愿通过add()方法继续添加数组。

2 个答案:

答案 0 :(得分:1)

真的,真的考虑换一个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);
}

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

答案 1 :(得分:0)

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

请注意,如果内存已预先分配,则应使用CArray::operator[]代替CArray::Add方法。