Saltar a contenido

Última actualización:2026-10-12

resize y reserve en vector de C++

En C++, resize y reserve son dos funciones miembro de los contenedores (por ejemplo std::vector) que sirven para gestionar el tamaño del vector y la asignación de memoria.

Por ejemplo:

std::vector<int> v1;
v1.resize(1000); //allocation + instance creation
cout <<(v1.size() == 1000)<< endl;   //prints 1
cout <<(v1.capacity()==1000)<< endl; //prints 1

std::vector<int> v2;
v2.reserve(1000); //only allocation
cout <<(v2.size() == 1000)<< endl;   //prints 0
cout <<(v2.capacity()==1000)<< endl; //prints 1

La función resize sirve para cambiar el tamaño del contenedor, aumentando o reduciendo el número de elementos del contenedor. Cuando se aumenta el tamaño del contenedor, los elementos añadidos se inicializan. Cuando se reduce el tamaño del contenedor, los elementos que exceden el nuevo tamaño se eliminan.

La función reserve sirve para preasignar el espacio de memoria del contenedor, sin cambiar su tamaño. Puede usarse para asignar de antemano memoria suficiente y evitar reasignaciones de memoria frecuentes, mejorando así el rendimiento. Ahora bien, llamar a reserve no cambia el tamaño del contenedor; solo le asigna espacio de memoria suficiente.

Conviene tener en cuenta que la disponibilidad de las funciones resize y reserve varía según el tipo de contenedor. La función resize está disponible para la mayoría de los tipos de contenedores, mientras que la función reserve solo es válida para los contenedores de tamaño dinámico, como std::vector y std::deque. Para los contenedores de tamaño fijo (por ejemplo std::array), llamar a reserve no tiene ningún efecto.

Desde el punto de vista del código fuente:

void resize(size_type new_size, value_type value = value_type()) {
    if (new_size < size()) {
        erase(begin() + new_size, end()); // 移除超出新大小的元素
    } else {
        insert(end(), new_size - size(), value); // 添加新元素
    }
}
void reserve(size_type _n) {
    if (__n > max_size())
     __throw_length_error(__N("vector::reserve"));
   if (capacity() < __n)
     _M_reallocate(__n);
}

Fin de esta sección

Temas relacionados

Comentarios