std :: vector.pop_back()是否会改变向量的容量?

时间:2009-10-08 09:52:08

标签: c++ stl vector memory-management

如果我在程序开头使用resize()reserve()将std :: vector分配到一定的大小和容量,那么pop_back()可能会“破坏”保留容量并导致重新分配?

6 个答案:

答案 0 :(得分:18)

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

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<>::shrink_to_fit()

答案 1 :(得分:4)

没有。 pop_back()不会缩小向量的容量。使用 而是std::vector<T>(v).swap(v)

答案 2 :(得分:4)

在C ++ 11下,可以调用shrink_to_fit()来请求向量(以及deque或字符串),以便将保留空间减少到向量的容量。但请注意,这取决于实现:它只是一个请求,并且无法保证。您可以尝试以下代码:

#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(); 

}

答案 3 :(得分:2)

pop_XXX永远不会改变容量。 push_XXX可以改变容量,如果你尝试推送的东西超过容量允许的数量。

答案 4 :(得分:1)

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

编辑:

我应该说push_backv.size() < v.capacity()不会改变容量。

答案 5 :(得分:1)

这是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(发布)的代码。因此它不会影响向量的容量(或重新分配)。