array c++ arrays vector

c++ - Arrays vs Vectors: Similitudes y diferencias introductorias



vector c++ (3)

Añadiré que las matrices son construcciones de muy bajo nivel en C ++ y deberías tratar de mantenerte alejado de ellas tanto como sea posible cuando estés "aprendiendo las cuerdas", incluso Bjarne Stroustrup lo recomienda (él es el diseñador de C ++).

Los vectores se acercan mucho al mismo rendimiento que las matrices, pero con muchas comodidades y características de seguridad. Probablemente comiences a utilizar matrices cuando interactúes con API que se ocupan de matrices en bruto, o cuando construyes tus propias colecciones.

¿Cuáles son las diferencias entre una matriz y un vector en C ++? Un ejemplo de las diferencias podría ser bibliotecas, simbolismos, habilidades, etc.

Formación

Las matrices contienen una cantidad específica de elementos de un tipo particular. Para que el compilador pueda reservar la cantidad de espacio requerida cuando se compila el programa, debe especificar el tipo y la cantidad de elementos que la matriz contendrá cuando se defina. El compilador debe poder determinar este valor cuando se compila el programa. Una vez que se ha definido una matriz, utiliza el identificador de la matriz junto con un índice para acceder a elementos específicos de la matriz. [...] las matrices tienen cero índice; es decir, el primer elemento está en el índice 0. Este esquema de indexación es indicativo de la estrecha relación en C ++ entre punteros y matrices y las reglas que el lenguaje define para la aritmética del puntero.

- Referencia de bolsillo C ++

Vector

Un vector es una secuencia de objetos de tamaño dinámico que proporciona acceso aleatorio al operator[] matriz. La función miembro push_back copia sus argumentos mediante el constructor de copias, agrega esa copia como el último elemento en el vector e incrementa su tamaño en uno. pop_back hace exactamente lo contrario, eliminando el último elemento. Insertar o eliminar elementos del final de un vector lleva un tiempo constante amortizado, y la inserción o eliminación desde cualquier otra ubicación lleva tiempo lineal. Estos son los conceptos básicos de los vectores. Hay mucho más para ellos. En la mayoría de los casos, un vector debe ser su primera opción sobre una matriz de estilo C. En primer lugar, tienen un tamaño dinámico, lo que significa que pueden crecer según sea necesario. No tiene que hacer todo tipo de investigación para determinar un tamaño estático óptimo, como en el caso de las matrices en C; un vector crece según sea necesario, y puede cambiar de tamaño más o menos grande de forma manual si es necesario. En segundo lugar, los vectores ofrecen comprobación de límites con la función miembro (pero no con el operator[] ), de modo que puede hacer algo si hace referencia a un índice inexistente en lugar de simplemente observar el bloqueo del programa o algo peor, continuar la ejecución con datos corruptos.

- Libro de cocina C ++


Esas referencias respondieron bastante a su pregunta. En pocas palabras, las longitudes de los vectores son dinámicas, mientras que las matrices tienen un tamaño fijo. cuando se utiliza una matriz, se especifica su tamaño en la declaración:

int myArray[100]; myArray[0]=1; myArray[1]=2; myArray[2]=3;

para vectores, solo lo declaras y agregas elementos

vector<int> myVector; myVector.push_back(1); myVector.push_back(2); myVector.push_back(3); ...

a veces no sabrá la cantidad de elementos necesarios para que un vector sea ideal para tal situación.


matrices:

  • son una construcción de lenguaje incorporado;
  • vienen casi sin modificaciones de C89;
  • proporcionar solo una secuencia de elementos contigua e indexable ; sin campanas y silbatos;
  • son de tamaño fijo; no puede cambiar el tamaño de una matriz en C ++ (a menos que sea una matriz de POD y esté asignada con malloc );
  • su tamaño debe ser una constante en tiempo de compilación a menos que se asignen dinámicamente;
  • toman su espacio de almacenamiento dependiendo del alcance donde los declaras;
  • si se asigna dinámicamente, debe desasignarlos explícitamente;
  • si se asignan dinámicamente, solo se obtiene un puntero y no se puede determinar su tamaño; de lo contrario, puede usar sizeof (de ahí el sizeof(arr)/sizeof(*arr) idioma común de sizeof(arr)/sizeof(*arr) , que sin embargo falla silenciosamente cuando se usa inadvertidamente en un puntero);
  • decaer automáticamente a un punteros en la mayoría de las situaciones; en particular, esto sucede al pasarlos a una función, que generalmente requiere pasar un parámetro separado para su tamaño;
  • no puede devolverse desde una función;
  • no se puede copiar / asignar directamente;
  • las matrices dinámicas de objetos requieren un constructor predeterminado, ya que todos sus elementos deben construirse primero;

std::vector :

  • es una clase de plantilla;
  • es una construcción solo en C ++;
  • se implementa como una matriz dinámica ;
  • crece y se contrae dinámicamente;
  • administrar automáticamente su memoria, que se libera en la destrucción;
  • se puede pasar a / regresar de funciones (por valor);
  • se puede copiar / asignar (esto realiza una copia profunda de todos los elementos almacenados);
  • no se descompone en punteros, pero puede obtener explícitamente un puntero a sus datos ( &vec[0] se garantiza que &vec[0] funcionará como se espera);
  • siempre trae junto con la matriz dinámica interna su tamaño (cuántos elementos se almacenan actualmente) y la capacidad (cuántos elementos se pueden almacenar en el bloque actualmente asignado);
  • la matriz dinámica interna no está asignada dentro del objeto mismo (que solo contiene algunos campos de "contabilidad"), pero se asigna dinámicamente por el asignador especificado en el parámetro de plantilla relevante; el predeterminado recibe la memoria del freestore (el llamado montón), independientemente de cómo se asigna el objeto real;
  • por esta razón, pueden ser menos eficientes que las matrices "normales" para arreglos locales pequeños y de corta vida;
  • al reasignar, los objetos se copian (se mueven, en C ++ 11);
  • no requiere un constructor predeterminado para los objetos que se almacenan;
  • está mejor integrado con el resto de los llamados STL (proporciona los métodos begin() / end() , los típicos typedef STL, ...)

También considere la "alternativa moderna" a las matrices - std::array ; Ya describí en otra respuesta la diferencia entre std::vector y std::array , es posible que desee echarle un vistazo.