Если я выделил std::vector для определенного размера и емкости, используя resize()
и reserve()
в начале моей программы, возможно ли, что pop_back()
может «сломать» зарезервированную емкость и вызвать перераспределение?
Изменяет ли std::vector.pop_back() емкость вектора?
Ответы (6)
Нет. Единственный способ уменьшить емкость вектора — это трюк со свопингом.
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()
.
Нет. pop_back() не уменьшит емкость вектора. вместо этого используйте std::vector<T>(v).swap(v)
.
В С++ 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();
}
pop_XXX никогда не изменит емкость. push_XXX может изменить емкость, если вы попытаетесь отправить больше материала, чем позволяет емкость.
НЕТ. Как и push_back
, pop_back
не повлияет на capacity()
. Они просто влияют на size()
.
РЕДАКТИРОВАТЬ:
Я должен был сказать, что push_back
не изменит емкость, когда v.size() < v.capacity()
.
Вот код 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;
}
}
Функция вызывает только деструктор и уменьшает указатель на последний элемент. Код из ВК (Релиз). Так что это не влияет на емкость (или перераспределение) вектора.