收缩矢量

Bra*_*mie 7 c++ stl vector

我的地形引擎有问题(使用DirectX).

我正在使用矢量来保存细节块的顶点.当块增加细节时,向量就会增加.

但是,当块减少其细节时,矢量的大小不会缩小.

所以,我的问题是:有没有办法缩小向量的大小?我试过这个:

vertexvector.reserve(16);
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 27

如果从向量中弹出元素,它不会释放内存(因为这会使迭代器无效进入容器元素).您可以将矢量复制到新矢量,然后将其与原始矢量交换.这将使它不浪费空间.Swap具有恒定的时间复杂度,因为交换不能使迭代器无效,而是交换的向量元素:因此它必须只交换内部缓冲区指针.

vector<vertex>(a).swap(a);
Run Code Online (Sandbox Code Playgroud)

它被称为"收缩适合"的习语.顺便提一下,下一个C++版本包含std :: vector的"shrink_to_fit()"成员函数.


Dav*_*ley 8

通常的技巧是用空向量交换:

vector<vertex>(vertexvector.begin(), vertexvector.end()).swap(vertexvector);
Run Code Online (Sandbox Code Playgroud)

  • @João:不一样,如果新的尺寸较小,则不需要调整大小来实际释放内存. (2认同)

Mat*_*ier 6

当矢量大小减小时,保留的存储器不会减少,因为它通常对性能更好.缩小向量保留的内存量与增加向量大小超出保留大小一样昂贵,因为它需要:

  1. 向分配器询问一个新的,更小的内存位置,
  2. 复制旧位置的内容,然后
  3. 告诉分配器释放旧的内存位置.

在某些情况下,分配器可以就地调整分配大小,但绝不保证.

如果您所需的大小发生了很大的变化,并且您知道您不希望该向量再次扩展(本地的主体暗示您会,但当然也有例外),那么您可以使用litb的建议交换操作以显式缩小向量:

vector<vertex>(a).swap(a);
Run Code Online (Sandbox Code Playgroud)