【问题标题】:Does std::vector.pop_back() change vector's capacity?std::vector.pop_back() 会改变向量的容量吗?
【发布时间】:2010-12-04 22:30:48
【问题描述】:

如果我在程序开始时使用resize()reserve() 将std::vector 分配给特定大小和容量,pop_back() 是否有可能“破坏”保留容量并导致重新分配?

【问题讨论】:

    标签: c++ stl vector memory-management


    【解决方案1】:

    在 C++11 下,可以调用 shrink_to_fit() 来请求向量(以及双端队列或字符串),以便将保留空间减少到向量的容量。但是请注意,这取决于实现:它只是一个请求,并且没有任何保证。你可以试试下面的代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(){
        vector<int> myVector;
    
        for (auto i=1;i!=1e3;++i)
            myVector.push_back(i);
    
        cout << "Capacity: " << myVector.capacity() << endl;
        myVector.reserve(2000);
        cout << "Capacity (after reserving 2000): " << myVector.capacity() << endl;
        myVector.shrink_to_fit();
        cout << "Capacity (after shrink_to_fit): " << myVector.capacity(); 
    
    }
    

    【讨论】:

      【解决方案2】:

      这里是std::vector::pop_back()的代码

      void pop_back()
      {   // erase element at end
         if (!empty())
         {    // erase last element
            _Dest_val(this->_Alval, this->_Mylast - 1);
            --this->_Mylast;
         }
      }
      

      函数只调用析构函数并减少指向最后一个元素的指针。 来自 VC(发布)的代码。所以它不会影响向量的容量(或重新分配)。

      【讨论】:

      • 一个特定的实现没有足够的信息来确定标准的要求。这可能与提问者使用的实现不同。
      【解决方案3】:

      没有。缩小向量容量的唯一方法是交换技巧

      template< typename T, class Allocator >
      void shrink_capacity(std::vector<T,Allocator>& v)
      {
         std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
      }
      

      即使这样也不能保证按照标准工作。 (虽然很难想象它不会工作的实现。)

      据我所知,C++ 标准的下一个版本(以前是 C++0x,但现在变成了 C++1x)将有 std::vector&lt;&gt;::shrink_to_fit()

      【讨论】:

      • 我强烈建议不要使用这个技巧,原因有以下三个: 1. 函数不一定按照它所说的那样做。 2 破坏了“最小意外”的原则 3. 可能会产生大量开销——更不用说复制而不是移动的潜在副作用了。
      • @einpoklum:是的,这是不动的,因此今天不是最理想的。但是这个答案已经有将近十年的历史了,所以......
      • @sbi: 我也建议不要这样做:-(
      • @einpoklum:所以你会的,嗯?好吧,当时 C++ 社区的想法并非如此。所以去图吧。
      【解决方案4】:

      pop_XXX 永远不会改变容量。如果您尝试推送超过容量允许的内容,push_XXX 可以更改容量。

      【讨论】:

        【解决方案5】:

        没有。与push_back 相同,pop_back 不会影响capacity()。它们只会影响size()

        编辑:

        我应该说push_back不会改变v.size() &lt; v.capacity()时的容量。

        【讨论】:

          【解决方案6】:

          没有。 pop_back() 不会缩小向量的容量。采用 std::vector&lt;T&gt;(v).swap(v) 代替。

          【讨论】:

          • @sbi 的回答重复;并在那里查看我对“交换技巧”的评论。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-10
          • 1970-01-01
          相关资源
          最近更新 更多