当前位置:  开发笔记 > 编程语言 > 正文

收缩矢量

如何解决《收缩矢量》经验,为你挑选了3个好方法。

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

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

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

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

vertexvector.reserve(16);

Johannes Sch.. 27

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

vector(a).swap(a);

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



1> Johannes Sch..:

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

vector(a).swap(a);

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



2> David Thornl..:

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

vector(vertexvector.begin(), vertexvector.end()).swap(vertexvector);


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

3> Matthew Xavi..:

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

    向分配器询问一个新的,更小的内存位置,

    复制旧位置的内容,然后

    告诉分配器释放旧的内存位置.

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

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

vector(a).swap(a);

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有