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(newint[size]);
En C ++ 14:
autoarray = std::make_unique<int[]>(size);
Ambos de los anteriores se basan en el mismo archivo de encabezado, #include <memory>
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.
int size = 5; // declare the size of the vectorvector<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
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 ¿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 dynamicallysize_t length;
length = 100; //for exampleint *array = newint[length];
// now let's change is's size - e.g. add 50 new elementssize_t added = 50;
int *added_array = newint[added];
/*
somehow set values to given arrays
*/// add elements to arrayint* temp = newint[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).
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.
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
std::vector<int>
. Y un libro .Respuestas:
int main() { int size; std::cin >> size; int *array = new int[size]; delete [] array; return 0; }
No olvide
delete
cada matriz con la que asignenew
.fuente
delete
, su código es incorrecto.Desde C ++ 11, existe una alternativa segura
new[]
ydelete[]
que tiene cero gastos generales a diferencia destd::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>
fuente
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
fuente
std::vector
con 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 preferirnew
.new[]
lugar destd::vector
.delete
nada manualmente. Además,std::vector
es una matriz dinámica y no hace nada con una lista vinculada. Es solo un envoltorio alrededor de un trozo de memoria.new
ydelete
para implementar envoltorios. El punto es que no administras un recurso y lo usas, haces lo uno o lo otro.int* array = new int[size];
fuente
std::vector::data()
función miembro devolverá la matriz sin procesar subyacente cuando sea necesario.operator&
lugar dedata()
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.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 usarmemcpy_s
ostd::copy
tambié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)
.fuente
asignar dinámicamente algo de memoria usando
new
:int* array = new int[SIZE];
fuente
#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
fuente