Si asigné un std :: vector a un cierto tamaño y capacidad usando resize()
y reserve()
al comienzo de mi programa, ¿es posible que pop_back()
"rompa" la capacidad reservada y cause reasignaciones?¿std :: vector.pop_back() cambia la capacidad del vector?
Respuesta
No. La única manera de reducir la capacidad de un vector es el truco de intercambio
template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}
y hasta que no se garantiza que funcione de acuerdo a la norma. (Aunque es difícil imaginar una implementación en la que no funcionaría)
Por lo que sé, la próxima versión del estándar C++ (lo que solía ser C++ 0x, pero ahora se convirtió en C++ 1x) tendrá std::vector<>::shrink_to_fit()
.
No. pop_back() no reducirá la capacidad del vector. use std::vector<T>(v).swap(v)
en su lugar.
Duplicate of @ sbi's answer; y vea mi comentario sobre el "truco de intercambio". – einpoklum
NO. Igual que push_back
, pop_back
no afectará el capacity()
. Solo afectan el size()
.
EDIT:
que debería haber dicho push_back
no va a cambiar la capacidad cuando el v.size() < v.capacity()
.
pop_XXX nunca cambiará la capacidad. push_XXX puede cambiar la capacidad si intenta empujar más cosas de lo que permite la capacidad.
Aquí está el código de 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;
}
}
función sólo llama al destructor y disminuye puntero al último elemento. Código de VC (versión). Por lo tanto, no afecta la capacidad (o la reasignación) del vector.
Una implementación particular no es suficiente información para determinar lo que exige el estándar. Y esta puede no ser la misma implementación que usa la persona que hace la pregunta. –
En C++ 11 se puede llamar a shrink_to_fit() para pedir un vector (así como un deque o una cadena) para reducir el espacio reservado a la capacidad del vector. Sin embargo, tenga en cuenta que esto depende de la implementación: es simplemente una solicitud y no hay garantía alguna. Puede probar el siguiente código:
#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();
}
- 1. std :: capacidad de vector después de copiar
- 2. ¿Cómo cambia la capacidad de StringBuilder?
- 3. std :: vector redimensionar hacia abajo
- 4. Capacidad inicial de vector en C++
- 5. std :: vector insert() reasignación
- 6. reducir la capacidad de un vector stl
- 7. ¿Puede un std :: vector ser = 'd a otro std :: vector?
- 8. C++ std :: pair, std :: vector y memcopy
- 9. Iterar std :: vector múltiple
- 10. std :: merge fusionando dos std :: vector coredump
- 11. Cómo exportar std :: vector
- 12. C++: obteniendo la dirección del inicio de un std :: vector?
- 13. sizeof() std :: vector (C++)
- 14. std :: vector de funciones
- 15. std :: list vs std :: vector iteration
- 16. Cómo reducir el tamaño de std :: vector?
- 17. std :: vector versus std :: array en C++
- 18. ¿cuál es la capacidad de un vector vacío?
- 19. std :: vector <std::string> crash
- 20. std :: vector de std :: vectores de contigüidad
- 21. std :: vector y std :: comportamiento min
- 22. ¿Cuál es la diferencia entre std :: set y std :: vector?
- 23. ¿Cómo funciona C++ std :: vector?
- 24. paso eficiente de std :: vector
- 25. std :: elementos de vector inicializando
- 26. Convertir std :: vector en matriz
- 27. Obtener matriz desde std: vector
- 28. std :: vector vs normal array
- 29. ¿Borrar varios objetos de un std :: vector?
- 30. Regreso std :: vector por valor
Recomendaría mucho este truco por tres razones: 1. La función no necesariamente hace lo que dice que hace. 2 Rompe el principio de "menos sorpresa" 3. Incurre en una gran cantidad de gastos indirectos, potencialmente, sin mencionar los posibles efectos secundarios de copiar en lugar de moverse. – einpoklum
@einpoklum: Sí, esto es sin moverse, y por lo tanto no es óptimo hoy. Pero esta respuesta tiene casi una década, así que ... – sbi
@sbi: Aconsejaría en contra de eso también :-( – einpoklum