我的地形引擎有问题(使用DirectX).
我正在使用矢量来保存细节块的顶点.当块增加细节时,向量就会增加.
但是,当块减少其细节时,矢量的大小不会缩小.
所以,我的问题是:有没有办法缩小向量的大小?我试过这个:
vertexvector.reserve(16);
Johannes Sch.. 27
如果从向量中弹出元素,它不会释放内存(因为这会使迭代器无效进入容器元素).您可以将矢量复制到新矢量,然后将其与原始矢量交换.这将使它不浪费空间.Swap具有恒定的时间复杂度,因为交换不能使迭代器无效,而是交换的向量元素:因此它必须只交换内部缓冲区指针.
vector(a).swap(a);
它被称为"收缩适合"的习语.顺便提一下,下一个C++版本包含std :: vector的"shrink_to_fit()"成员函数.
如果从向量中弹出元素,它不会释放内存(因为这会使迭代器无效进入容器元素).您可以将矢量复制到新矢量,然后将其与原始矢量交换.这将使它不浪费空间.Swap具有恒定的时间复杂度,因为交换不能使迭代器无效,而是交换的向量元素:因此它必须只交换内部缓冲区指针.
vector(a).swap(a);
它被称为"收缩适合"的习语.顺便提一下,下一个C++版本包含std :: vector的"shrink_to_fit()"成员函数.
通常的技巧是用空向量交换:
vector(vertexvector.begin(), vertexvector.end()).swap(vertexvector);
当矢量大小减小时,保留的存储器不会减少,因为它通常对性能更好.缩小向量保留的内存量与增加向量大小超出保留大小一样昂贵,因为它需要:
向分配器询问一个新的,更小的内存位置,
复制旧位置的内容,然后
告诉分配器释放旧的内存位置.
在某些情况下,分配器可以就地调整分配大小,但绝不保证.
如果您所需的大小发生了很大的变化,并且您知道您不希望该向量再次扩展(本地的主体暗示您会,但当然也有例外),那么您可以使用litb的建议交换操作以显式缩小向量:
vector(a).swap(a);