为二维向量预留内存,C++

3

我看到很多关于这个话题的问题都在stackoverflow上。然而,在任何一个问题中,我都找不到我的答案。因此,提出这个问题。

我有

vector< vector< int > > temp

我可以为外部向量保留内存:
temp.reserve(20);

现在,我想为每个内部向量保留内存。我可以使用以下方法完成:
temp[i].reserve(500);

然而,如果我使用temp.clear(); 那么temp的容量仍然保持为20。 但是,现在如果我用20个内部向量初始化temp向量,这些内部向量的容量将被重置为0(根据VS2010 Intellisense)。
我的问题:
1. 如何在清空并重新初始化外部向量后保留内部向量的500个容量? 2. 我正在使用OpenCV findContours函数。 这个函数清除外部向量并填充新的一组内部向量。 这个函数会导致内存的释放和重新分配吗?

3
当您调用clear()函数时,所有内部向量都会被销毁。如果您想要保留它们的容量,则需要为每个内部向量单独调用clear()函数。 - VoidStar
std::vector::clear 是否保证保留容量? - jamesdlin
是的,分配的内存没有被释放,只有元素被销毁并且大小变为0。 - VoidStar
@jamesdlin 不,这并不是完全可靠的。我曾经使用过一种实现方式,在“清除”时释放了内存(尽管我记不清是哪个编译器了)。 - Mark B
感谢大家的回答。@VoidStar:我可以通过清除每个内部向量来保留其容量。但是,一旦清除外部向量,内部向量就会被销毁。不幸的是,OpenCV函数(findContours)会清除外部向量。所以我想我必须处理内部向量的释放和重新分配。 - VP.
显示剩余2条评论
1个回答

1

1) 在C++中无法实现。根据定义,清除外部向量会销毁内部向量,释放它们的所有内存。

2) 如果清除外部向量并重新创建它,则是导致了一次释放和分配操作。

不幸的是,我无法确定您的潜在问题,因此无法提供更多关于可能解决方案的帮助。

编辑:您可以将outer设置为指向(可能是智能的)指向内部向量的指针的向量,这些向量存储在/从池中检索。然后,当清除outer时,仅清除指针本身,而池化的内部向量仍然存在。


谢谢你的回答。我特别想找到一种清除和重新创建外部向量并防止内部向量内存被释放后重新分配的方法。然而,我认为在C++中这是不可能的。 - VP.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接