【问题标题】:STL's vector resizingSTL 的矢量调整大小
【发布时间】:2012-05-07 05:22:56
【问题描述】:

我找不到这条信息。我在这里处理一个奇怪的情况,我在一个循环中,我可以在任何给定时间获得随机信息。此信息必须存储在向量中。现在每一帧我都必须设置这个向量以确保我不会占用空间(我正在使用索引将值写入向量中的随机点)。

现在假设没有办法改变这段代码,我想知道,如果我发送一个与向量大小完全相同的参数,向量是否会“忽略”resize() 函数?我在哪里可以找到这些信息?

【问题讨论】:

    标签: c++ stl vector


    【解决方案1】:

    来自 MSDN 参考1

    如果容器的大小小于请求的大小_Newsize,则将元素添加到向量中,直到达到请求的大小。如果容器的大小大于请求的大小,则删除最靠近容器末端的元素,直到容器达到大小_Newsize。如果容器的当前大小与请求的大小相同,则不采取任何措施

    ISO C++ 标准(第 485 页 2vector::resize 指定此行为

    void resize ( size_type sz , T c = T ());
    
    if ( sz > size ())
      insert ( end () , sz - size () , c );
    else if ( sz < size ())
      erase ( begin ()+ sz , end ());
    else
    ; // Does nothing
    

    所以是的,向量会忽略它,您不需要自己执行检查。

    【讨论】:

      【解决方案2】:

      有点像。

      使用 resize() 简单地调整向量的大小只会导致向量本身使用更多内存(将改变其元素使用的内存量)。如果保留空间中没有足够的空间,它将重新分配(有时他们喜欢自己填充一点,即使有你可能会增长)。如果已经有足够的空间容纳请求的大小和它想要做的任何填充,它就不会重新增长。

      当规范说超过尺寸末尾的元素将被删除时,它的意思是就地。基本上它会为它正在删除的每个元素调用 _M_buff[i].~T() 。因此,您的对象 分配 的任何内存都将被删除,假设析构函数有效,但对象本身占用的空间(它的大小)不会。向量会不断增长,不断增长,再增长到您告诉它的最大大小,并且在它存在时不会重新缩小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多