Изменяет ли переменная std::vector.pop_back()?

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

Ответы

Ответ 1

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

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

и даже это не гарантирует работу в соответствии со стандартом. (Хотя трудно представить себе реализацию, где она не будет работать.)

Насколько я знаю, следующая версия стандарта С++ (то, что раньше было С++ 0x, но теперь стало С++ 1x), будет иметь std::vector<>::shrink_to_fit().

Ответ 2

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

Ответ 3

В С++ 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

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

Ответ 5

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

EDIT:

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

Ответ 6

Вот код 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 (Release). Таким образом, это не влияет на емкость (или перераспределение) вектора.