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