Namespaces
Variants

std::vector<T,Allocator>:: resize

From cppreference.net

void resize ( size_type count ) ;
(1) (constexpr desde C++20)
void resize ( size_type count, const value_type & value ) ;
(2) (constexpr desde C++20)

Redimensiona el contenedor para contener count elementos:

  • Si count es igual al tamaño actual, no hace nada.
  • Si el tamaño actual es mayor que count , el contenedor se reduce a sus primeros count elementos.
  • Si el tamaño actual es menor que count , entonces:
1) Se añaden copias adicionales de T ( ) (hasta C++11) elementos insertados por defecto (desde C++11) .
2) Se añaden copias adicionales de value .

Contenidos

Parámetros

count - nuevo tamaño del contenedor
value - el valor para inicializar los nuevos elementos
Requisitos de tipo
-

Si se cumple la siguiente condición, el comportamiento es indefinido:

1) T no es DefaultInsertable o MoveInsertable en vector .
2) T no es CopyInsertable en vector .
(desde C++11)

Complejidad

Lineal en la diferencia entre el tamaño actual y count . Complejidad adicional posible debido a la reasignación si la capacidad es menor que count .

Excepciones

Si se lanza una excepción por cualquier motivo, estas funciones no tienen efecto ( garantía de seguridad de excepción fuerte ). Aunque no está explícitamente especificado, std::length_error se lanza si la capacidad requerida por el nuevo vector excedería max_size() .

En la sobrecarga ( 1 ) , si el constructor de movimiento de T no es noexcept y T no es CopyInsertable en * this , vector utilizará el constructor de movimiento que lanza excepciones. Si éste lanza una excepción, la garantía se suspende y los efectos no están especificados.

(desde C++11)

Notas

Si la inicialización por valor en la sobrecarga ( 1 ) no es deseable, por ejemplo, si los elementos son de tipo no-clase y no se necesita ponerlos a cero, puede evitarse proporcionando un personalizado Allocator::construct .
La capacidad del vector nunca se reduce al redimensionar a un tamaño menor porque eso invalidaría todos los iteradores, mientras que la especificación solo invalida los iteradores hacia/después de los elementos borrados.

Ejemplo

#include <vector>
#include <iostream>
void print(auto rem, const std::vector<int>& c)
{
    for (std::cout << rem; const int el : c)
        std::cout << el << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<int> c = {1, 2, 3};
    print("The vector holds: ", c);
    c.resize(5);
    print("After resize up to 5: ", c);
    c.resize(2);
    print("After resize down to 2: ", c);
    c.resize(6, 4);
    print("After resize up to 6 (initializer = 4): ", c);
}

Salida:

The vector holds: 1 2 3
After resize up to 5: 1 2 3 0 0
After resize down to 2: 1 2
After resize up to 6 (initializer = 4): 1 2 4 4 4 4

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 679 C++98 resize() pasaba value por valor pasa por referencia constante
LWG 1525 C++98 el comportamiento de resize ( size ( ) ) no estaba especificado especificado
LWG 2033 C++11 1. los elementos se eliminaban usando erase() [1]
2. los requisitos de tipo de T eran incorrectos
1. usa pop_back()
2. corregido
LWG 2066 C++11 la sobrecarga ( 1 ) no tenía la garantía de seguridad
de excepciones de la sobrecarga ( 2 )
añadida
LWG 2160 C++11 los elementos se eliminaban usando pop_back() [2]
debido a la resolución de LWG 2033
no especifica el método
de eliminar elementos
  1. erase() puede eliminar elementos en medio de un vector , por lo que el tipo de valor debe ser MoveAssignable para que los elementos siguientes a la sección eliminada puedan moverse hacia adelante para llenar el vacío. Sin embargo, resize() solo puede eliminar elementos al final del vector , haciendo que el MoveAssignable sea innecesario.
  2. Eliminar elementos usando pop_back() implica que los elementos deben eliminarse de atrás hacia adelante.

Véase también

devuelve el número máximo posible de elementos
(función miembro pública)
devuelve el número de elementos
(función miembro pública)
devuelve el número de elementos que pueden almacenarse en el espacio de memoria actualmente asignado
(función miembro pública)
verifica si el contenedor está vacío
(función miembro pública)