¿Cuál es la mejor manera de almacenar una lista 2D muy grande de flotadores en c ++? ¿Manejo de errores?

Estoy migrando algo de código de c a c ++.

He cambiado algunas llamadas a malloc para la asignación de memoria de estructura a new llamadas.

Básicamente, antes de que el código que transporto estuvieran los arreglos de malloc’ing que contenían múltiples conjuntos de acordes de fotogtwigs, cada uno de un par de cientos de miles de flotadores, por lo que la longitud total del arreglo podría estar en decenas de millones de coordenadas.

¿Qué tipo de estructura / contenedor debo usar?

¿Y qué tipo de protecciones necesito para detectar errores relacionados con la memoria?


Editar 1
He retitulado / reformulado la pregunta para reflejar con mayor precisión lo que estoy tratando de hacer.

Creo que algún tipo de estructura de lista en 2D podría hacer el truco … ¿posiblemente un std :: deque of std :: deque (s)?

La respuesta es std::vector .

No necesita mucha memoria en realidad (o tiene alguna plataforma con memoria limitada, supongo que nos lo habría dicho en ese caso). El vector está perfectamente bien para este propósito. Y no tienes que gestionar la memoria tú mismo.

Puede utilizar vectores de vectores si desea administrar varios de ellos a la vez.

Pero algunos flotadores 10 ^ 6s definitivamente no es un gran problema hoy en día.

Actualización : Una cosa más si vas con deque . Por favor , no acceda a objetos deque por índice en bucles. En realidad, el deque es fuerte en la inserción en ambos lados, pero no en el acceso a objetos por índice. Y probablemente no en la inserción de objetos en el medio, como he visto en alguna parte.

Cuando la asignación a través de new std::bad_alloc lanza std::bad_alloc . Pero, ¿realmente requieres tantos floats en la ubicación de la memoria continua? Si no, puede echar un vistazo a otras estructuras de datos como std::deque o std::list

EDITAR : la list no tiene sentido ya que solicita un reemplazo para una matriz.

EDITAR: Si desea una matriz de estilo C ++, primero recomendaría boost::matrix :

 boost::matrix my_matrix(n, m); 

Si no puedes usar boost, entonces recomendaría un vector de vectores.

 std::vector > m_matrix(n, std::vector(m)); 

(note el espacio después del primer>, esto es necesario porque >> es un operador en C ++).

También puede utilizar un deque de deques (o una combinación de vectores y deques). La gran diferencia es que los vectores garantizan que los elementos se almacenan en un bloque de memoria contiguo donde un deque no lo hace. Esto puede o no ser bueno para sus propósitos.

Deques también es más eficiente para insertar nuevos elementos en el centro de la estructura.

Sí, una llamada a nuevo puede fallar. Generalmente, si una llamada a nuevo falla, lanza una excepción std :: bad_alloc, que puede capturar. Dado que está migrando código de c a c ++, podría ser más fácil usar std :: nothrow, lo que hará que el nuevo devuelva un puntero nulo (como Malloc).

 try { my_array = new float[num_points]; } catch(std::bad_alloc &exp) { ... } 

o

 my_array = new (std::nothrow) float[num_points]; if(m_array == NULL) { ... }