Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 收缩向量_C++_Stl_Vector - Fatal编程技术网

C++ 收缩向量

C++ 收缩向量,c++,stl,vector,C++,Stl,Vector,我的地形引擎(使用DirectX)有问题 我使用一个向量来保持细节块的顶点。 当块的细节增加时,向量也会增加 但是,当块减少其细节时,向量的大小不会缩小 那么,我的问题是:有没有办法缩小向量的大小? 我确实试过: vertexvector.reserve(16); 通常的技巧是使用空向量交换: vector<vertex>(vertexvector.begin(), vertexvector.end()).swap(vertexvector); vector(vertexvect

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

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

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

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

vertexvector.reserve(16);

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

vector<vertex>(vertexvector.begin(), vertexvector.end()).swap(vertexvector);
vector(vertexvector.begin(),vertexvector.end()).swap(vertexvector);

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

vector<vertex>(a).swap(a);
向量(a)交换(a);
它被称为“收缩以适应”成语。顺便说一句,下一个C++版本包含了一个用于STD:“vector”的“SyrSytoToFig()”成员函数。p> 当向量大小减小时,保留内存不会减少,因为它通常对性能更好。缩小向量保留的内存量与将向量的大小增加到保留大小之外一样昂贵,因为它需要:

  • 向分配器请求一个新的、更小的内存位置
  • 从旧位置复制内容,然后
  • 告诉分配器释放旧内存位置
  • 在某些情况下,分配器可以就地调整分配的大小,但这并不能保证

    如果所需的大小发生了很大变化,并且您知道不希望该向量再次扩展(局部性原则建议您这样做,但当然也有例外),那么您可以使用litb建议的交换操作显式收缩向量:

    vector<vertex>(a).swap(a);
    
    向量(a)交换(a);
    此功能有一个成员函数,收缩到合适的位置。它比大多数其他方法更有效,因为它只会在需要时分配新内存和拷贝。细节在这里讨论,


    如果您不介意libc分配函数realloc更高效,它不会在收缩上复制数据,只需将多余的内存标记为空闲,如果您增加内存,并且在增加内存后有空闲内存,它会将所需的内存标记为已用,而不是复制。但是,要小心,你正在从C++的STL模板中移出C空洞指针,需要了解指针和内存管理是如何工作的,它现在被许多bug所掩盖,这是错误和内存泄漏的来源。如果是这样,vector.resize(n)也可以。@João:不一样,如果新大小更小,则实际上释放内存时不需要resize。@user83255旧帖子,但即使是新向量也不需要0空格。我看到了一个以非0偏移量开始的实现。