Cómo crear una matriz dinámica de números enteros

84

¿Cómo crear una matriz dinámica de enteros en C ++ usando la newpalabra clave?

Sudantha
fuente
11
Utiliza un std::vector<int>. Y un libro .
GManNickG
¿Cómo asigna y accede a sus datos una vez que se inicializan?
Eche un vistazo a esta publicación, aquí se proporciona en detalle para todo tipo de tipos de datos: programmingtunes.com/dynamic-array-in-c
user2808359
quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = La% 20statement% 20defines% 20and% 20initializes, of% 20an% 20array% 20of% 20integers. & text = Esta% 20statement% 20will% 20dynamically% 20asign, integers% 20from% 20the% 20heap ...
Nagappa

Respuestas:

127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

No olvide deletecada matriz con la que asigne new.

Jason Iverson
fuente
27
No haré -1, pero si es posible que lo olvide delete, su código es incorrecto.
GManNickG
2
8 años después, ese comentario podría confundir a los principiantes @GManNickG, ¿qué tal si lo eliminas (ya que supongo que se hizo antes de que Jason Iverson eliminara la matriz)?
Gsamaras
2
@gsamaras: Estoy de acuerdo en que es confuso, pero aún así es correcto: su código no debería tener una eliminación manual que debe recordar no olvidar. Es decir, utiliza punteros inteligentes y otros contenedores.
GManNickG
@GManNickG Creo que tu comentario podría ser menos dogmático. El código es correcto, incluso si no es ideal. Los punteros y contenedores inteligentes son casi siempre una mejor opción (especialmente en una pregunta para principiantes como esta) pero no "siempre" siempre.
Spencer
64

Desde C ++ 11, existe una alternativa segura new[]y delete[]que tiene cero gastos generales a diferencia de std::vector:

std::unique_ptr<int[]> array(new int[size]);

En C ++ 14:

auto array = std::make_unique<int[]>(size);

Ambos de los anteriores se basan en el mismo archivo de encabezado, #include <memory>

Ben Voigt
fuente
No sé si soy solo yo, pero esa sintaxis de C ++ 11 se ve horrible. El C ++ 14 se ve mucho mejor. Por otra parte, no he mantenido el ritmo desde pre-C ++ 11. Es difícil recordar todas estas nuevas expresiones.
Keya Kersting
29

Es posible que desee considerar el uso de la biblioteca de plantillas estándar. Es simple y fácil de usar, además de que no tiene que preocuparse por las asignaciones de memoria.

http://www.cplusplus.com/reference/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array
jveazey
fuente
18
Ok, pero responder la pregunta real también es bueno.
Ed S.
8
@Ed, la restricción en la pregunta parece bastante arbitraria. std::vectorcon el constructor apropiado funciona realmente bien y debe señalarse como una alternativa. A veces, las personas hacen la pregunta mal, y esto podría contar como uno de esos casos: es muy breve y no da ninguna razón para preferir new.
Mark Ransom
3
@Ed: No hay razón para usar en new[]lugar de std::vector.
GManNickG
2
@baash: En C ++, nunca hay una razón. Si decide, por cualquier motivo, "eliminar la biblioteca estándar", ya no está programando en C ++. Mi comentario es para el lenguaje C ++, no el C ++ - lenguaje-que-usamos-en-mi-dispositivo. Aun así, nunca debería necesitar deletenada manualmente. Además, std::vectores una matriz dinámica y no hace nada con una lista vinculada. Es solo un envoltorio alrededor de un trozo de memoria.
GManNickG
1
@Montdidier: No. Todavía usa newy deletepara implementar envoltorios. El punto es que no administras un recurso y lo usas, haces lo uno o lo otro.
GManNickG
6
int* array = new int[size];
Ed S.
fuente
2
Simplemente responde la pregunta.
Ed S.
@GManNickG ¿Porque el vector puede ser más conveniente o por otras razones? Porque a menudo encuentro funciones de terceros que requieren el uso de matrices en lugar de vectores.
Lèse majesté
5
@ Lèsemajesté Esa no es razón para no usar vectores: la std::vector::data()función miembro devolverá la matriz sin procesar subyacente cuando sea necesario.
emlai
3
@zenith: Normalmente, usaría en operator&lugar de data()obtener un puntero de un vector, pero es cierto que un vector proporciona la garantía de contigüidad necesaria para la compatibilidad con funciones que esperan arreglos.
Ben Voigt
3

Tan pronto como la pregunta sea sobre la matriz dinámica, es posible que desee no solo crear una matriz con tamaño variable, sino también cambiar su tamaño durante el tiempo de ejecución. Aquí hay un ejemplo con memcpy, puede usar memcpy_so std::copytambién. Dependiendo del compilador, <memory.h>o <string.h>puede ser necesario. Al utilizar estas funciones, asigna una nueva región de memoria, copia los valores de las regiones de memoria originales en ella y luego los libera.

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

Puede utilizar la constante 4 en lugar de sizeof(int).

carimus
fuente
1

asignar dinámicamente algo de memoria usando new:

int* array = new int[SIZE];
Montdidier
fuente
2
Probablemente le falten los dos puntos o no haya reemplazado SIZE con un tamaño real .
Montdidier
5
¿Por qué debería haber un punto y coma? No es una declaración completa. Puede que haya más declaraciones. Esto, si se incluye en un programa completo, hace lo que pidió el OP.
Benjamin Lindley
0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

El código anterior funciona, el tamaño máximo de matriz flotante o int que se podría definir era con el tamaño 2095879, y la condición de salida sería un número de entrada inicial distinto de cero

shawndfernandes
fuente