Меняет ли std :: vector.pop_back () емкость вектора? - PullRequest
14 голосов
/ 08 октября 2009

Если я выделил std :: vector для определенного размера и емкости, используя resize() и reserve() в начале моей программы, возможно ли, что pop_back() может "сломать" зарезервированную емкость и вызвать перераспределение?

Ответы [ 6 ]

18 голосов
/ 08 октября 2009

Нет. Единственный способ уменьшить емкость вектора - трюк со свопом

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().

4 голосов
/ 26 ноября 2015

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

}
4 голосов
/ 08 октября 2009

Нет. pop_back () не будет уменьшать емкость вектора. использование std::vector<T>(v).swap(v) вместо.

2 голосов
/ 09 октября 2009

pop_XXX никогда не изменит емкость. push_XXX может изменить емкость, если вы попытаетесь вставить больше материала, чем позволяет емкость.

1 голос
/ 13 апреля 2013

Вот код 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;
   }
}

Функция вызывает только Деструктор и уменьшает указатель на последний элемент. Код от ВК (Релиз). Так что это не влияет на емкость (или перераспределение) вектора.

1 голос
/ 08 октября 2009

NO. То же, что push_back, pop_back не повлияет на capacity(). Они просто влияют на size().

EDIT:

Я должен был сказать, push_back не изменит емкость, когда v.size() < v.capacity().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...