2012-06-25 20 views
7

Cuál es la diferencia exacta entre las matrices dinámicas y los vectores. Fue una pregunta de entrevista para mí.Arrays dinámicos vs vectores STL ¿diferencia exacta?

  1. Dije que ambos tienen memoria secuencial.

  2. Los vectores pueden aumentar de tamaño en cualquier punto del código. Luego dijo que incluso las matrices dinámicas pueden crecer en tamaño después de la creación.

  3. Dije que los vectores están libres de errores porque está en la biblioteca estándar. Dijo que proporcionará un archivo .so de arreglos dinámicos que está libre de errores y tiene todas las cualidades a la par con STL.

Estoy confundido y no contestó la diferencia exacta. Cuando busqué en Internet, solo había visto las declaraciones anteriores.

¿Puede alguien explicarme la diferencia exacta? ¿Y qué esperaba el entrevistador de mí?

+2

Se olvidó de la gran biblioteca de algoritmos enviada gratis con el compilador. – DumbCoder

+0

ver también http://stackoverflow.com/q/381621/1025391 – moooeeeep

+0

oh no .. Dije que no había errores ... escribí incorrectamente arriba y ahora edité – Rajesh

Respuesta

0

La memoria de matriz asignada para vectores se libera cuando el vector sale del ámbito, en caso de que el vector se declare en la pila (la matriz de respaldo estará en el montón).

void foo() { 
    vector<int> v; 

    // ... method body 

    // backing array will be freed here 
} 
10

él dijo que proporcionará como archivo .so de matrices dinámicas, que está libre de errores y tiene todas las cualidades a la par con STL.

Si la dinámica de la clase Array hace lo mismo que std::vector (es decir: se implementa RAII para limpiar después de sí mismo, puede crecer y encogerse y cualquier otra cosa que std::vector hace), entonces sólo hay una ventaja importante std::vector tiene sobre su dinámica de la clase matriz:

std::vector es estandarizada y todo el mundo sabe que. Si veo un std::vector en algún fragmento de código, sé exactamente lo que hace y cómo se supone que debe usarse. Sin embargo, si veo un my::dynamic_array, no lo sé en absoluto. Tendría que tener que mirar su documentación o incluso - ¡jadeo! - implementación para averiguar si my_dynamic_array::resize() hace lo mismo que std::vector::resize().

+0

Creo que la matriz dinámica aquí no significa una clase, sino solo un conjunto dinámicamente asignado que utiliza 'new []'. –

+0

@Als: "matrices dinámicas que ... tienen todas las cualidades a la par con STL". No puedes hacer eso sin crear una clase. – sbi

+0

Según el entrevistador, dijo que es una clase. – Rajesh

5

Una gran oferta aquí depende de lo que él quiera decir con una "matriz dinámica". La mayoría de las personas significa algo donde la memoria se asigna con array-new y liberado con array-delete. Si esa es la intención aquí, entonces tener cualidades a la par con std::vector simplemente no es posible.

La razón es bastante simple: std::vector asigna de forma rutinaria un trozo de memoria más grande que el necesario para mantener la cantidad de elementos almacenados actualmente. Luego construye objetos en esa memoria según sea necesario para expandirse. Con array-new, sin embargo, no tiene otra opción: está asignando una matriz de objetos, por lo que si asigna espacio para (digamos) 100 objetos, termina con 100 objetos creados en ese espacio (inmediatamente) . Simplemente no tiene ninguna disposición para tener un búfer, una parte de la cual contiene objetos reales, y otra parte es simplemente memoria, que no contiene nada.

Supongo que si desea estirar un punto, es posible imitar std::vector y aún asignar el espacio con array-new. Para hacerlo, solo tiene que asignar una matriz de char, y luego usar la ubicación new para crear objetos en ese espacio de memoria sin formato. Esto permite prácticamente las mismas cosas que std::vector, porque es casi lo mismo que std::vector. Sin embargo, todavía nos falta un nivel (potencial) de indirección: std::vector realmente asigna memoria a través de un objeto Allocator para que pueda cambiar exactamente cómo asigna su memoria bruta (de manera predeterminada usa std::allocator<T>, que usa operator new, pero si desea , podrías escribir un asignador que usaría new char[size], aunque no puedo imaginar por qué lo harías).

Podrías, por supuesto, escribir tu matriz dinámica para usar un objeto asignador también. En ese punto, para todos los fines prácticos, acaba de reinventar std::vector bajo un (presumiblemente) nuevo nombre. En ese caso, @sbi sigue teniendo razón: el mero hecho de que no esté estandarizado significa que aún le falta una de las principales cualidades de std:::vector: la calidad de ser estandarizado y ya conocido por todos los que conocen C++. Incluso sin eso, sin embargo, tenemos que estirar la frase "matriz dinámica" para (y yo postularía, más allá) el punto de ruptura para obtener las mismas cualidades que std::vector, incluso si ignoramos la estandarización.

1

espero que querían que para hablar de las trampas de olvidar para eliminar la matriz dinámica con el operador delete [] y luego ellos mismos se confundió cuando trataron de ayudarle a lo largo; no tiene mucho sentido implementar una matriz dinámica como una clase simple, ya que se hornea en el tipo de elemento.

Cuestiones relacionadas