2009-10-08 10 views

Respuesta

18

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

+1

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

+0

@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

+0

@sbi: Aconsejaría en contra de eso también :-( – einpoklum

4

No. pop_back() no reducirá la capacidad del vector. use std::vector<T>(v).swap(v) en su lugar.

+0

Duplicate of @ sbi's answer; y vea mi comentario sobre el "truco de intercambio". – einpoklum

1

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

2

pop_XXX nunca cambiará la capacidad. push_XXX puede cambiar la capacidad si intenta empujar más cosas de lo que permite la capacidad.

1

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.

+1

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. –

4

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

}