No puedo estar en desacuerdo con el espíritu de la respuesta aceptada con suficiente fuerza. ¿"Una herramienta de último recurso"? ¡Lejos de ahi!
A mi modo de ver, una de las características más fuertes de C ++ en comparación con C y con otros lenguajes similares es la capacidad de expresar restricciones para que puedan verificarse en el momento de la compilación y se pueda evitar el uso accidental. Entonces, al diseñar una estructura, pregúntese qué operaciones debería permitir. Todos los demás usos deberían estar prohibidos, y es mejor si tales restricciones pueden implementarse estáticamente (en el momento de la compilación) para que el mal uso provoque un error de compilación.
Entonces, cuando se necesita una matriz, las respuestas a las siguientes preguntas especifican su comportamiento: 1. ¿Es su tamaño a) dinámico en tiempo de ejecución, o b) estático, pero solo conocido en tiempo de ejecución, o c) estático y conocido en tiempo de compilación? 2. ¿Se puede asignar la matriz en la pila o no?
Y en base a las respuestas, esto es lo que veo como la mejor estructura de datos para dicha matriz:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Sí, creo unique_ptr<std::array>
que también debería considerarse, y tampoco es una herramienta de último recurso. Solo piense qué se adapta mejor a su algoritmo.
Todos estos son compatibles con API C simples a través del puntero sin formato a la matriz de datos ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PD Además de las consideraciones anteriores, también hay una de propiedad: std::array
y std::vector
tiene una semántica de valor (tiene soporte nativo para copiar y pasar por valor), mientras unique_ptr<T[]>
que solo se puede mover (impone la propiedad única). Cualquiera puede ser útil en diferentes escenarios. Por el contrario, las matrices estáticas simples ( int[N]
) y las matrices dinámicas simples ( new int[10]
) no ofrecen ninguna y, por lo tanto, deben evitarse si es posible, lo que debería ser posible en la gran mayoría de los casos. Si eso no fuera suficiente, las matrices dinámicas simples tampoco ofrecen forma de consultar su tamaño, una oportunidad adicional para daños en la memoria y agujeros de seguridad.
std::shared_ptr<T[]>
, pero debería haberlo, y probablemente estará en C ++ 14 si alguien pudiera molestarse en escribir una propuesta. Mientras tanto, siempre hayboost::shared_array
.