La diferencia entre cambiar el tamaño y preservar el espacio para vectores en C
Para implementar la semántica de cambio de tamaño, la interfaz de cambio de tamaño ofrece dos garantías:
Una es garantizar que los datos sean válidos dentro del intervalo [0, nuevo_tamaño), si el El índice de subíndice está aquí. Dentro del intervalo, vector[índice] es legal.
El segundo es garantizar que los datos fuera del rango [0, new_size] no sean válidos. Si el índice del subíndice está fuera de este rango, vector[indext] es ilegal.
reserva simplemente garantiza que el tamaño del espacio (capacidad) del vector es al menos igual al tamaño especificado por su parámetro n. Dentro del intervalo [0, n], si el subíndice es índice, vector[índice] puede o no ser legal para dicho acceso, dependiendo del contexto.
La similitud entre las interfaces de cambio de tamaño y reserva es que ambas garantizan que la capacidad del vector sea al menos tan grande como la capacidad especificada por su argumento.
Dado que el código fuente de ambas interfaces es bastante compacto, puedes pegarlo aquí:
void resize(size_type new_size) { resize(new_size, T()) }; p>
void resize(size_type new_size.const Tamp; x) {
if (new_size lt; size())
erase(begin() new_size , end() ); // Borra los datos fuera del rango y asegúrate de que los datos fuera del rango no sean válidos
else
insert(end(), new_size - size(), x ); // Complete los datos en blanco dentro del intervalo para garantizar que los datos en el intervalo sean válidos
}
void reserve(size_type n) {
if ( capacidad() lt; n) {
const size_type old_size = size();
iterador tmp = allocate_and_copy(n, inicio, fin
); destruir (inicio, finalizar);
desasignar(
inicio = tmp;
finalizar = tmp old_size; start n;
}
}
II./t/20050121/10/3742864.html
vector Cuando push_back, si Si no hay espacio suficiente, se agregará algo de espacio automáticamente. Si no hay espacio reservado disponible,
solicitará directamente otro espacio continuo disponible, copiará los datos allí, luego eliminará el espacio anterior y utilizará. el nuevo espacio
Resulta en una baja eficiencia
Si predice que se necesitará una gran cantidad de espacio por adelantado, puede reservar una cierta cantidad de espacio con anticipación para evitar la asignación repetida de memoria y
grandes cantidades de transmisión de datos.
El tamaño se refiere a todo el espacio utilizado para almacenar datos excepto el espacio extra reservado.
El cambio de tamaño también es fácil de entender. Si no inicializa una determinada parte de
(por ejemplo, el tamaño original es 100 y ahora el cambio de tamaño es 200), llame al método. constructor predeterminado para inicializarlo. Los 100 restantes,
(si es un tipo integrado, inicialícelo a 0; no tengo particularmente claro la inicialización de tipos integrados, puede verificarlo. sacarlo).
capacidad devuelve el tamaño de todo el espacio, incluido el espacio reservado, normalmente equivalente al tamaño del espacio reservado que de otro modo se obtendría según la política de asignación. La definición formal de Capacidad es el número máximo de elementos que un vector puede contener sin reasignar espacio
Por ejemplo, vector lt;
asertar(v.capacidad()==16);
vector lt; v;
cout lt; ; // Esto depende de la implementación de la biblioteca,