2010-04-21 16 views
18

Algunos programadores parecen odiarlos violentamente, mientras que otros parecen pensar que están bien. Sé que cualquier cosa que se pueda hacer en una matriz multidimensional también se puede hacer en una matriz regular, por lo que son funcionalmente equivalentes. ¿Es una mala práctica usar matrices multidimensionales, o no importa?¿Es una mala práctica utilizar matrices multidimensionales en C/C++?

+0

Considera boost :: multi_array como alternativa. Resuelve algunos de los problemas de las matrices con menos de la sobrecarga y la sintaxis difícil de manejar de los vectores anidados. – frankc

Respuesta

12

¿Necesita almacenar datos multidimensionales donde conozca las dimensiones con anticipación? Si es así, usa una matriz multidimensional.

Si no conoce las dimensiones antes de tiempo (es decir, vas a tener que asignar dinámicamente la matriz), a continuación, ya sea que o bien

  • asignar una matriz unidimensional y emular una matriz usando aritmética índice n-dimensional, o
  • asignar una matriz de punteros a conjuntos de elementos para obtener la semántica matriz multidimensional reales

depende del caso de uso específico, pero como regla general, Casi siempre prefiero que el primero sea porque hace que haya menos problemas de administración de memoria y menos asignaciones de almacenamiento dinámico. La complejidad de ambos enfoques crece a medida que aumenta el número de dimensiones, pero, en mi opinión, crece mucho más rápido para este último enfoque debido a los niveles adicionales de indirección.

+0

Además, emular una matriz n-dimensional con una dimensión puede hacer que su programa se ejecute mucho más rápido si recorre sus datos de filas por columnas, porque los datos contiguos se cargarán en la memoria caché de datos. Mientras que las matrices multidimensionales asignadas dinámicamente obtendrán una tasa de error de caché más alta ya que los datos probablemente se almacenan en diferentes ubicaciones. – hdl

0

Bueno, en C++ no me gustan las matrices multidimensionales porque deberían reemplazarse por std::vector<std::vector<t> >. También son particularmente importantes si quiere representar un std::vector<std::basic_string<t> >.

Las matrices multidimensionales son tan simples, primitivas, estoy sorprendido que a la mayoría le importaría. Sin embargo, un diseño que usa una sola dimensión es probablemente mejor que uno que use múltiples dimensiones, siendo iguales todos los demás factores.

4

Ventajas de matrices multi-DIM para Vector<Vector<>>

  1. fácil de escribir [] []
  2. C compatibles.
  3. Simple de entender conceptualmente qué es lo que está haciendo.

Desventajas:

  1. No se detectaron fácilmente comprobación de límites. El límite del extremo de los corchetes externos generalmente se desborda en la memoria asignada por los corchetes internos, lo que hace que este tipo de error sea un verdadero dolor de seguimiento.
  2. Arrays dentados requieren cuidado para configurar. El patrón de vector es fácil.
  3. Las matrices multidimensioal son más que dobles punteros, por lo que es difícil pasar a las funciones correctamente. La mayoría de las veces, los he visto pasar como una dirección bruta a un doble puntero que derrota las matemáticas intrínsecas que el compilador hará por ti.

Básicamente, sin embargo, todo se reduce a la falta de comprobación de límites para mí.

+2

re # 1: 'vector > a (1, vector (1)); a [0] [0] = ... 'está bien. – Potatoswatter

+0

Claro y yo uso eso. No es tan fácil de escribir ni tan intuitivo como un [1] [1]; aunque creo que es una gran razón por la cual los vectores vectores no se utilizan tanto como deberían. Diablos, un typedef o macro (ugh) probablemente podría enmascarar la fealdad si es necesario. –

+2

Nunca usaría un 'vector >' a menos que mi caso de uso fuera irregular. –

0

Es posible almacenar datos multidimensionales en una matriz de datos única, pero debe hacer un seguimiento de los índices usted mismo.Las matrices multidimensionales en realidad se almacenan en la memoria como una única matriz dimensional, con sintaxis para ayudar a representar esos datos como multidimensionales.

Si está trabajando con datos multidimensionales, entonces creo que es más apropiado elegir la herramienta correcta para el trabajo (una matriz multidimensional).

0

Si el cálculo del índice multidimensional te molesta, std::valarray con std::slice es la abstracción estándar.

+0

No veo nada multidimensional sobre eso. –

+0

@Ben: se agregó un enlace al aspecto multidimensional. – Potatoswatter

0

sé que cualquier cosa que se pueda hacer a una matriz multidimensional puede también hacerse a una matriz regular

Yo no creo que sea del todo exacta. Necesitaremos una serie de indicadores para almacenar algo tan básico como una lista de nombres y luego ordenarlo. O punteros a punteros para almacenar una cadena de longitud variable y luego una lista de tales cadenas. Como las preguntas originales solo mencionan las matrices per se, no se puede ver cómo problemas como estos se pueden hacer con la misma facilidad en una matriz regular. Considere no solo almacenar las cadenas en una matriz 1-D (utilizando algún tipo de separador) sino también realizar operaciones como la clasificación.

+0

Una matriz de punteros sigue siendo una matriz 1-D. – Maulrus

+0

Una expresión de índice de matriz es equivalente a una escrita como puntero y desplazamiento. cf. Kernighan y Ritchie p99. – AruniRC

1

Hay siguientes ventajas de matrices multidimensionales sobre Vector<Vector<>>:

  • que son fáciles de entender.
  • La búsqueda y clasificación de elementos se puede realizar muy fácilmente.
  • Son compatibles con C.
  • Son fáciles de escribir.
Cuestiones relacionadas