2009-04-16 39 views
44

Quiero agregar un int en una matriz, pero el problema es que no sé cuál es el índice ahora.Cómo agregar elementos a la matriz C++?

int[] arr = new int[15]; 
arr[0] = 1; 
arr[1] = 2; 
arr[2] = 3; 
arr[3] = 4; 
arr[4] = 5; 

Ese código funciona porque sé lo que voy a asignar índice a, pero lo que si no sé el índice ...

En PHP, puedo hacer arr[]=22;, que se sumarán automáticamente 22 al siguiente índice vacío de la matriz. Pero en C++ no puedo hacer eso, me da un error de compilación. ¿Qué sugieren ustedes, chicos?

+11

En realidad, "that codes" ni siquiera compila. "int [] arr" no es como usted declara una matriz en C/C++ - es "int arr []". Pero su código tiene problemas más graves, que las otras respuestas abordan. –

Respuesta

36

No hay manera de hacer lo que usted dice en C++ con matrices planas. La solución de C++ para eso es mediante el uso de la biblioteca STL que le da el std::vector.

Puede utilizar un vector de esta manera:

std::vector<int> arr; 

arr.push_back(1); 
arr.push_back(2); 
arr.push_back(3); 
+1

Necesitará "#include "! = D –

+0

Merece la pena señalar que puede obtener la matriz del vector como si necesitara pasarla como una matriz: https://stackoverflow.com/a/2923290/802397 – netpoetica

58

Las matrices en C++ no pueden cambiar el tamaño en tiempo de ejecución. Para ese propósito, debe usar vector<int> en su lugar.

vector<int> arr; 
arr.push_back(1); 
arr.push_back(2); 

// arr.size() will be the number of elements in the vector at the moment. 

Como se ha mencionado en los comentarios, vector se define en vector cabecera y std espacio de nombres. Para usarlo, usted debe:

#include <vector>

y también, o bien utilizar std::vector en el código o añadir

using std::vector; 

o

using namespace std; 

después de la línea #include <vector>.

+1

+1 -> Estoy de acuerdo, los vectores son, de lejos, la forma más sencilla de hacerlo. No olvide que necesita: #include

+2

Además, use std :: vector o agregue usando std :: vector antes de la creación de instancias. –

13

usar un vector:

#include <vector> 

void foo() { 
    std::vector <int> v; 
    v.push_back(1);  // equivalent to v[0] = 1 
} 
11
int arr[] = new int[15]; 

La variable arr sostiene una dirección de memoria. En la dirección de la memoria, hay 15 entradas consecutivas en una fila. Se pueden referenciar con el índice 0 a 14 inclusive.

En php puedo hacer esto arr [] = 22; esto agregará automáticamente 22 al próximo índice de matriz vacío.

No existe el concepto de "siguiente" cuando se trata de arreglos.
Una cosa importante que creo que se está perdiendo es que tan pronto como se crea la matriz, todos los elementos de la matriz ya existen. No están inicializados, pero todos ya existen. Entonces no estás 'llenando' los elementos de la matriz sobre la marcha, ya están llenos, solo con valores no inicializados. No hay forma de probar un elemento no inicializado en una matriz.

Parece que desea utilizar una estructura de datos como queue o stack o vector.

6

Estoy completamente de acuerdo con la forma vector al implementar una matriz dinámica.Sin embargo, tenga en cuenta que STL le proporciona una gran cantidad de contenedores que se adaptan a los diferentes requisitos de tiempo de ejecución. Debe elegir uno con cuidado. Por ejemplo, para una inserción rápida en la parte posterior, puede elegir entre vector y deque.

Y casi lo olvido, con gran poder viene una gran responsabilidad :-) Dado que vector s son flexibles en tamaño, a menudo se reasignan automágicamente para ajustar para agregar elementos. Tenga cuidado con la invalidación de iteradores (sí, se aplica también a los punteros)) Sin embargo, mientras esté usando operator[] para acceder a los elementos individuales, está seguro.

+0

+1 para la referencia automágicamente:) –

1

Me puede estar perdiendo el sentido de su pregunta aquí, y si es así me disculpo. Pero, si no va a eliminar ningún elemento solo para agregarlo, ¿por qué no simplemente asignar una variable al próximo espacio vacío? Cada vez que agregue un nuevo valor a la matriz, simplemente incremente el valor para apuntar a la siguiente.

En C++ una mejor solución es el uso de la biblioteca estándar de tipo std::list<type>, que también permite a la matriz a crecer de forma dinámica, por ejemplo:

#include <list> 

std::list<int> arr; 

for (int i = 0; i < 10; i++) 
{ 
    // add new value from 0 to 9 to next slot 
    arr.push_back(i); 
} 

// add arbitrary value to the next free slot 
arr.push_back(22); 
1

Si está escribiendo en C++ - es una mejor manera de usar estructuras de datos de una biblioteca estándar como vector.

Las matrices de estilo C son muy propensas a errores y deben evitarse siempre que sea posible.

2

inicializar todos los elementos de la matriz a NULL en primer lugar, a continuación, busque la nula para encontrar la ranura vacía

8

Usted no tiene que utilizar vectores. Si desea seguir con matrices de fricción, se puede hacer algo como esto:

int arr[] = new int[15]; 
unsigned int arr_length = 0; 

Ahora, si desea agregar un elemento al final de la matriz, se puede hacer esto:

if (arr_length < 15) { 
    arr[arr_length++] = <number>; 
} else { 
    // Handle a full array. 
} 

No es tan corto y elegante como el equivalente en PHP, pero logra lo que intentaba hacer. Para permitirle cambiar fácilmente el tamaño de la matriz en el futuro, puede usar un #define.

#define ARRAY_MAX 15 

int arr[] = new int[ARRAY_MAX]; 
unsigned int arr_length = 0; 

if (arr_length < ARRAY_MAX) { 
    arr[arr_length++] = <number>; 
} else { 
    // Handle a full array. 
} 

Esto hace que sea mucho más fácil administrar la matriz en el futuro. Al cambiar de 15 a 100, el tamaño de la matriz se cambiará correctamente en todo el programa. Tenga en cuenta que deberá establecer la matriz en el tamaño máximo esperado, ya que no puede cambiarla una vez que se haya compilado el programa. Por ejemplo, si tiene una matriz de tamaño 100, nunca podría insertar 101 elementos.

Si va a utilizar los elementos de la final de la matriz, se puede hacer esto:

if (arr_length > 0) { 
    int value = arr[arr_length--]; 
} else { 
    // Handle empty array. 
} 

Si usted quiere ser capaz de eliminar elementos fuera el principio, (es decir, un FIFO), la solución se vuelve más complicado. También necesita un índice inicial y final.

#define ARRAY_MAX 15 

int arr[] = new int[ARRAY_MAX]; 
unsigned int arr_length = 0; 
unsigned int arr_start = 0; 
unsigned int arr_end = 0; 

// Insert number at end. 
if (arr_length < ARRAY_MAX) { 
    arr[arr_end] = <number>; 
    arr_end = (arr_end + 1) % ARRAY_MAX; 
    arr_length ++; 
} else { 
    // Handle a full array. 
} 

// Read number from beginning. 
if (arr_length > 0) { 
    int value = arr[arr_start]; 
    arr_start = (arr_start + 1) % ARRAY_MAX; 
    arr_length --; 
} else { 
    // Handle an empty array. 
} 

// Read number from end. 
if (arr_length > 0) { 
    int value = arr[arr_end]; 
    arr_end = (arr_end + ARRAY_MAX - 1) % ARRAY_MAX; 
    arr_length --; 
} else { 
    // Handle an empty array. 
} 

Aquí, estamos utilizando el operador de módulo (%) para hacer que los índices se envuelvan. Por ejemplo, (99 + 1)% 100 es 0 (un incremento de envoltura). Y (99 + 99)% 100 es 98 (una disminución de envoltura). Esto le permite evitar declaraciones if y hacer que el código sea más eficiente.

También puede ver rápidamente qué tan útil es #define a medida que su código se vuelve más complejo.Desafortunadamente, incluso con esta solución, nunca podría insertar más de 100 elementos (o el máximo que configure) en la matriz. También está utilizando 100 bytes de memoria, incluso si solo se almacena 1 elemento en la matriz.

Esta es la razón principal por la que otros tienen vectores recomendados. Un vector se gestiona detrás de escena y se asigna nueva memoria a medida que la estructura se expande. Todavía no es tan eficiente como una matriz en situaciones donde el tamaño de los datos ya es conocido, pero para la mayoría de los propósitos, las diferencias de rendimiento no serán importantes. Hay intercambios para cada enfoque y lo mejor es conocer ambos.

+0

Definitivamente soy un principiante en C++, pero recibo un muy consistente 'Inicializador de matrices debe ser una lista de inicializadores' cuando intento su método 'int arr [] = new int [15];' de inicializar la matriz ' arr'. –

Cuestiones relacionadas