Jak utworzyć dynamiczną tablicę liczb całkowitych

85

Jak stworzyć dynamiczną tablicę liczb całkowitych w C ++ za pomocą newsłowa kluczowego?

Sudantha
źródło
11
Używasz std::vector<int>. I książkę .
GManNickG
jak przypisać i uzyskać dostęp do jego danych po zainicjowaniu?
Rzucić okiem na ten post, tutaj jest podane szczegółowo dla każdego rodzaju typów danych: programmingtunes.com/dynamic-array-in-c
user2808359
quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = The% 20statement% 20defines% 20and% 20initializes, of% 20an% 20array% 20of% 20integers. & text = This% 20statement% 20will% 20dynamically% 20allocate, integers% 20from% 20the% 20heap ...
Nagappa

Odpowiedzi:

127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Nie zapomnij o deletekażdej przydzielonej tablicy new.

Jason Iverson
źródło
27
Nie zrobię -1, ale jeśli możesz nawet zapomnieć o tym delete, twój kod jest zły.
GManNickG
2
8 lat później ten komentarz może zmylić początkujących @GManNickG, a co powiesz na jego usunięcie (skoro przypuszczam, że powstał zanim Jason Iverson faktycznie usunął tablicę)?
gsamaras
2
@gsamaras: Zgadzam się, że to zagmatwane, ale nadal jest poprawne: Twój kod nie powinien mieć ręcznego usuwania, o którym musisz pamiętać, aby nie zapomnieć. Oznacza to, że używane inteligentne wskaźniki i inne pojemniki.
GManNickG
@GManNickG Myślę, że Twój komentarz może być mniej dogmatyczny. Kod jest poprawny, nawet jeśli nie jest idealny. Inteligentne wskaźniki i kontenery są prawie zawsze lepszą opcją (szczególnie w przypadku takich pytań dla początkujących), ale nie „zawsze” zawsze.
Spencer
66

Od C ++ 11 istnieje bezpieczna alternatywa dla new[]i delete[]która jest zerowym narzutem w przeciwieństwie do std::vector:

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

W C ++ 14:

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

Oba powyższe opierają się na tym samym pliku nagłówkowym, #include <memory>

Ben Voigt
źródło
Nie wiem, czy to tylko ja, ale ta składnia C ++ 11 wygląda okropnie. C ++ 14 wygląda znacznie lepiej. Z drugiej strony nie nadążyłem od czasów poprzedzających C ++ 11. Trudno jest zapamiętać te wszystkie nowe wyrażenia.
Keya Kersting
29

Możesz rozważyć użycie biblioteki szablonów standardowych. Jest prosty i łatwy w użyciu, a ponadto nie musisz się martwić o alokacje pamięci.

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
źródło
18
Ok, ale odpowiedź na pytanie też jest miła.
Ed S.
8
@Ed, ograniczenie w pytaniu wydaje się raczej arbitralne. std::vectorz odpowiednim konstruktorem działa naprawdę dobrze i należy go wskazać jako alternatywę. Czasami ludzie źle zadają pytanie, a to może się liczyć jako jeden z tych przypadków - jest bardzo krótkie i nie daje żadnego uzasadnienia dla preferowania new.
Mark Ransom
3
@Ed: Nie ma powodu, aby używać new[]zamiast std::vector.
GManNickG
2
@baash: W C ++ nigdy nie ma powodu. Jeśli z jakiegoś powodu zdecydujesz się „usunąć bibliotekę standardową”, nie będziesz już programować w C ++. Mój komentarz dotyczy języka C ++, a nie języka C ++ - języka, którego używamy na moim urządzeniu. Mimo to nie powinieneś deleteniczego robić ręcznie, nigdy. Ponadto, std::vectorjest tablicą dynamiczną, a nie robi nic z połączonej listy. To tylko opakowanie wokół kawałka pamięci.
GManNickG
1
@Montdidier: Nie. Nadal używasz newi deleteimplementujesz otoki. Chodzi o to, że nie zarządzasz zasobem i nie używasz go, robisz jedno lub drugie.
GManNickG
6
int* array = new int[size];
Ed S.
źródło
2
Po prostu odpowiada na pytanie.
Ed S.
@GManNickG Ponieważ wektor może być wygodniejszy lub z innych powodów? Ponieważ często napotykam funkcje innych firm, które wymagają użycia tablic zamiast wektorów.
Lèse majesté
5
@ Lèsemajesté Nie ma powodu, aby nie używać wektorów - std::vector::data()funkcja członkowska zwróci podstawową tablicę surową, gdy będzie to potrzebne.
emlai
3
@zenith: Zwykle używałbyś operator&raczej niż data()pobierania wskaźnika z wektora, ale prawdą jest, że wektor zapewnia gwarancję ciągłości potrzebną do zgodności z funkcjami oczekującymi tablic.
Ben Voigt
3

Gdy tylko pojawi się pytanie o tablicę dynamiczną, możesz chcieć nie tylko utworzyć tablicę o zmiennej wielkości, ale także zmienić jej rozmiar w czasie wykonywania. Oto przykład z memcpy, możesz również użyć memcpy_slub std::copy. W zależności od kompilatora <memory.h>lub <string.h>może być wymagane. Korzystając z tej funkcji, przydzielasz nowy obszar pamięci, kopiujesz do niego wartości oryginalnych regionów pamięci, a następnie zwalniasz je.

//    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;

Możesz użyć stałej 4 zamiast sizeof(int).

carimus
źródło
1

dynamicznie przydziel trochę pamięci za pomocą new:

int* array = new int[SIZE];
Montdidier
źródło
2
Prawdopodobnie brakuje ci dwukropka lub nie zastąpiłeś ROZMIAR rzeczywistym rozmiarem.
Montdidier
5
Dlaczego powinien być średnik? To nie jest pełne stwierdzenie. Może być więcej deklaracji. To, jeśli jest zawarte w pełnym programie, spełnia to, o co prosił PO.
Benjamin Lindley
-1
#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;
}

Powyższy kod działa, maksymalny rozmiar tablicy typu float lub int, który można zdefiniować, to rozmiar 2095879, a warunek wyjścia byłby różny od zera początkowy numer wejściowy

shawndfernandes
źródło
Nie ma to nic wspólnego z pytaniem o tablicę dynamiczną.
Ben Voigt