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++?
Respuesta
¿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.
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
¿Cómo implementaría mi favorite algorithm sin él?
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.
Ventajas de matrices multi-DIM para Vector<Vector<>>
- fácil de escribir [] []
- C compatibles.
- Simple de entender conceptualmente qué es lo que está haciendo.
Desventajas:
- 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.
- Arrays dentados requieren cuidado para configurar. El patrón de vector es fácil.
- 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í.
re # 1: 'vector
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. –
Nunca usaría un 'vector
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).
Si el cálculo del índice multidimensional te molesta, std::valarray
con std::slice
es la abstracción estándar.
No veo nada multidimensional sobre eso. –
@Ben: se agregó un enlace al aspecto multidimensional. – Potatoswatter
Puedo recomendar Boost.MultiArray. Boost.MultiArray proporciona una definición de concepto de matriz N-dimensional genérica e implementaciones comunes de esa interfaz.
http://www.boost.org/doc/libs/1_42_0/libs/multi_array/doc/index.html
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.
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.
- 1. es @unlink una mala práctica?
- 2. Usando numpy.argmax() en matrices multidimensionales
- 3. matrices multidimensionales en una estructura en C#
- 4. ¿Es una mala práctica escribir a $ _POST?
- 5. ¿Se considera una mala práctica utilizar el posicionamiento absoluto?
- 6. array_map para matrices multidimensionales
- 7. eficiente System.arraycopy en matrices multidimensionales
- 8. PHP combina dos matrices multidimensionales
- 9. Powershell matrices multidimensionales
- 10. PHP: Combinar matrices multidimensionales
- 11. matrices multidimensionales de JavaScript
- 12. ¿Es una mala práctica escribir manipuladores de eventos en línea
- 13. array_diff() con matrices multidimensionales
- 14. PHP ordenar matrices multidimensionales
- 15. Implementación eficiente de matrices multidimensionales en Java?
- 16. ¿Es una mala práctica tener estado en una clase estática?
- 17. ¿Es una mala práctica utilizar la asignación de referencia en PHP al manejar variables potencialmente indefinidas?
- 18. ¿Es una mala práctica alterar las matrices dinámicas que tienen referencias sobre ellas?
- 19. indexOf sintaxis para matrices multidimensionales?
- 20. ¿Es una mala práctica usar uno mismo en decoradores?
- 21. ¿Es una mala práctica poner usuarios externos en Active Directory?
- 22. ¿Es una mala práctica usar las características C en C++?
- 23. ¿En general es una mala práctica tener muchos parámetros "initWith"?
- 24. ¿Es una mala práctica buscar en Rails I18n?
- 25. ¿Es una mala práctica usar muchos viewmodels en asp.net mvc
- 26. ¿Es una mala práctica o un olor codificado utilizar un contenedor IoC al instalar dependencias?
- 27. Implantar y explotar matrices multidimensionales
- 28. ¿Es una mala práctica usar el módulo requireJS como singleton?
- 29. ¿Es una mala práctica tener un método de inicialización largo?
- 30. ¿La mala práctica de "arrojar excepciones" es?
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