首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收缩向量

收缩向量
EN

Stack Overflow用户
提问于 2009-02-25 16:02:44
回答 4查看 11.6K关注 0票数 7

我的地形引擎(使用DirectX)出现了问题。

我正在使用一个矢量来保存细节块的顶点。当块的细节增加时,向量也会增加。

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

那么,我的问题是:有没有办法缩小向量的大小?我确实试过这个:

代码语言:javascript
复制
vertexvector.reserve(16);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-25 16:11:31

通常的技巧是用一个空向量进行交换:

代码语言:javascript
复制
vector<vertex>(vertexvector.begin(), vertexvector.end()).swap(vertexvector);
票数 8
EN

Stack Overflow用户

发布于 2009-02-25 16:12:52

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

代码语言:javascript
复制
vector<vertex>(a).swap(a);

它被称为“收缩到合适”的成语。顺便说一句,下一个C++版本包括std::vector的"shrink_to_fit()“成员函数。

票数 27
EN

Stack Overflow用户

发布于 2009-02-25 16:16:41

当向量大小减小时,保留的内存不会减少,因为这通常更有利于性能。缩小向量保留的内存量与将向量的大小增加到超过保留大小的开销一样大,因为这需要:

  1. 向分配器请求一个新的、较小的内存位置,
  2. 从旧位置复制内容,
  3. 告诉分配器释放旧内存位置。

在某些情况下,分配器可以就地调整分配的大小,但这绝不是有保证的。

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

代码语言:javascript
复制
vector<vertex>(a).swap(a);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/586634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档