我正在使用MFC项目中的代码,该项目使用CArray类来处理动态数组。它的工作原理如下:
CArray<CUSTOM_STRUCT> arr;
while(some_criteria)
{
CUSTOM_STRUCT cs;
add.add(cs);
}
这种方法很有效,但随着动态数组的大量增加,它变得非常慢。所以我很好奇,有没有办法在我开始调用add()方法之前在CArray中预先分配内存?
但有一点需要注意。在进入while()循环之前,我只能估计数组中元素的大致数量。
PS。我不能使用除CArray之外的任何其他数组。
PS2。由于此prokect的复杂性,我宁愿通过add()方法继续添加数组。
答案 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
方法。