2009-04-16 22 views
7

Estoy aprendiendo a programar, y C++ es mi primer idioma. No se moleste en usar punteros para mostrarme; aún no los entiendo, y no me molestaré hasta que tenga más tiempo libre para dedicarme a esto.¿Se puede cambiar el tamaño de una matriz C++ después de la inicialización?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

me asignaron (no estoy tomando clases - aprendiendo con algunos amigos me está ayudando a cabo) un algoritmo de tipo de combinación, con el algoritmo explicado, pero no la implementación. Quiero reescribir esto para que funcione tanto para enteros pares como impares. He intentado añadir este código:

if ((n % 2) != 0) int farray[halfelements + 1]; 

Así que podría utilizar el mismo entero para iterar sobre ambas matrices posteriores. Un sizeof (farray) muestra 16 bytes o 4 enteros. Entonces no está redimensionando. Lo que quiero saber es si es posible cambiar el tamaño de las matrices después de que se inicializaron.

Editar: ¿Cómo implementaría un vector? No entiendo cómo usar iteradores en un ciclo para iterar y copiar los valores.

Respuesta

16

Las matrices de C++ son de tamaño fijo.

Si necesita una "matriz de tamaño variable", querrá usar std::vector en lugar de una matriz.

+0

OK, gracias. He descubierto cómo implementarías std :: vector en este algoritmo.Aunque desearía que no había pasado dos horas depurar el código, sólo para averiguar mi cabecera de la función "mergesort int (std :: vector, int)" faltaba un "" =/ – jkeys

+0

no son respaldadas 'Vector's por matrices dinámicas de todos modos? Dinámicamente la modificación del tamaño de una matriz o un vector debe incurrir en las mismas penalizaciones de rendimiento derecha> – Jason

1

Si desea cambiar el tamaño de una matriz, es probable que desee utilizar un vector, que puede cambiar de tamaño automáticamente.

4

Mi consejo es aún más fuerte: use std::vector<> (et al.) A menos que tenga una muy buena razón para usar una matriz estilo C. Como está aprendiendo C++, dudo que tenga una razón: use std::vector<>.

+0

Dado un vector se guarenteed utilizar almacenamiento contiguo, incluso cuando se pasa a un método de tomar puntero puede utilizar un vector. Solo cuando pasa una referencia/puntero a un puntero para un método de tamaño de los datos, se queda atrapado con el uso de la memoria sin formato. – Richard

1

Puede usar el operador [] con un vector de la misma manera que lo haría en una matriz. Se podría aplicar esto con un vector de algo como esto (si desea utilizar más métodos vectoriales):

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

También puede utilizar .at (índice) para agregar comprobación de límites al acceso del vector.

+0

no utilizan por favor la etiqueta HTML "pre" para el código - en su lugar, seleccionar el código con el ratón y pulse Ctrl-K o haga clic en el icono de código –

+0

Se debe utilizar el vector (iter, iter) constructores. vector farray (originalarray.begin(), y originalarray [medio]), sarray (y originalarray [medio], originalarray.end()); Elimina la copia después. Pero eso probablemente sea confuso. – jmucchiello

0

Si quieres saber por qué su primera idea compilado pero no parece funcionar:

Cuando se omite apoyos en una sentencia if-:

if ((n % 2) != 0) int farray[halfelements + 1]; 

que es lo mismo que si 'ellos usado D:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

por lo tanto, está haciendo un 'farray' del tamaño correcto - y luego inmediatamente se sale del ámbito y se ha ido, y se queda únicamente con la original.

2

También recomendaría std::vector. Sin embargo, si está atascado con una matriz, siempre puede malloc la memoria y luego realloc si necesita aumentar la matriz.

Haga una búsqueda aquí en SO, hay información sobre malloc y realloc.

+0

Yo también uso esta convención. – Hydro

Cuestiones relacionadas