Cambiar el tamaño en C ++ es incómodo debido a la posible necesidad de llamar a constructores y destructores.
No creo que haya una razón fundamental por la cual en C ++ no podrías tener un resize[]
operador con quien ir new[]
y delete[]
eso hizo algo similar a esto:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Obviamente oldsize
, se recuperaría de una ubicación secreta, en la misma ubicación delete[]
, y Type
vendría del tipo de operando. resize[]
fallaría si el tipo no se puede copiar, lo cual es correcto, ya que estos objetos simplemente no se pueden reubicar. Finalmente, el código anterior construye por defecto los objetos antes de asignarlos, lo que no querría como comportamiento real.
Hay una posible optimización en la que newsize <= oldsize
, para llamar a los destructores de los objetos "más allá del final" de la matriz recién ensmallened y no hacer nada más. El estándar tendría que definir si esta optimización es necesaria (como cuando se trata de resize()
un vector), permitida pero no especificada, permitida pero dependiente de la implementación o prohibida.
La pregunta que debería hacerse es, "¿es realmente útil proporcionar esto, dado que vector
también lo hace, y está diseñado específicamente para proporcionar un contenedor que se puede cambiar de tamaño (de memoria contigua? Ese requisito se omite en C ++ 98 pero arreglado en C ++ 03) que se ajusta mejor que las matrices con las formas de hacer las cosas de C ++? "
Creo que la respuesta es generalmente "no". Si desea hacer búferes redimensionables a la manera de C, use malloc / free / realloc
, que están disponibles en C ++. Si desea hacer búferes redimensionables a la manera de C ++, use un vector (o deque
, si en realidad no necesita almacenamiento contiguo). No intente mezclar los dos utilizando new[]
para búferes sin formato, a menos que esté implementando un contenedor similar a un vector.