Як створити динамічний масив цілих чисел


84

Як створити динамічний масив цілих чисел у C ++ за допомогою newключового слова?


11
Ви використовуєте a std::vector<int>. І книжка .
GManNickG

як призначити та отримати доступ до його даних після їх ініціалізації?

Погляньте на цю публікацію, тут вона докладно наведена для будь-якого типу типів даних: programmingtunes.com/dynamic-array-in-c
user2808359


quora.com/What-is-the-misan-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = Заява% 20визначає% 20і% 20 ініціалізує, % %an% 20array% 20of% 20integers. & text = Це% 20заява% 20динамічно% 20розподілить, цілі числа% 20від% 20купи ...
Нагаппа

Відповіді:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Не забувайте про deleteкожен масив, який ви виділяєте new.


27
Я не буду -1, але якщо ви навіть можете це забути delete, ваш код помилковий.
GManNickG

2
Через 8 років цей коментар може збити з пантелику початківців @GManNickG, як щодо його видалення (оскільки, гадаю, це було зроблено до того, як Джейсон Айверсон фактично видалив масив)?
gsamaras

2
@gsamaras: Я згоден, що це бентежить, але все одно це правильно: ваш код не повинен мати ручного видалення, про що ви повинні пам’ятати, щоб не забути. Тобто використовували розумні вказівники та інші контейнери.
GManNickG

@GManNickG Я думаю, що ваш коментар може бути менш догматичним. Код правильний, навіть якщо він не ідеальний. Розумні вказівники та контейнери майже завжди є кращим варіантом (особливо в таких питаннях для початківців), але не завжди завжди.
Спенсер

64

Так як C ++ 11, є безпечна альтернатива new[]і delete[]що нульовий накладні витрати в відміну від std::vector:

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

У C ++ 14:

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

Обидва вищезазначені покладаються на один і той же файл заголовка, #include <memory>


Не знаю, чи це лише я, але синтаксис C ++ 11 виглядає жахливо. C ++ 14 виглядає набагато краще. Знову ж я не встигав з часів до C ++ 11. Згадати всі ці нові вирази важко.
Кія Керстінг,

29

Ви можете розглянути можливість використання стандартної бібліотеки шаблонів. Він простий і простий у використанні, крім того, вам не доведеться турбуватися про розподіл пам'яті.

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

18
Гаразд, але відповісти на актуальне питання теж приємно.
Ed S.

8
@Ed, обмеження у питанні виглядає досить довільним. std::vectorз відповідним конструктором працює дуже добре, і його слід вказати як альтернативу. Іноді люди ставлять запитання погано, і це може бути одним із таких випадків - він дуже короткий і не дає обгрунтування переваги new.
Mark Ransom,

3
@Ed: Немає жодної причини використовувати new[]замість std::vector.
GManNickG,

2
@baash: У C ++ ніколи немає причин. Якщо ви з будь-якої причини вирішили "видалити стандартну бібліотеку", ви більше не програмуєте на C ++. Мій коментар стосується мови C ++, а не C ++ - мови, якою ми користуємось на моєму пристрої. Незважаючи на це, вам ніколи не потрібно deleteнічого робити вручну. Крім того, std::vectorє динамічним масивом і нічого не робить із пов’язаним списком. Це просто обгортка навколо шматка пам'яті.
GManNickG,

1
@Montdidier: Ні. Ви все ще використовуєте newі deleteдля реалізації обгортки. Справа в тому, що ти не керуєш ресурсом і не використовуєш його, а робиш те чи інше.
GManNickG,

6
int* array = new int[size];

2
Це просто відповідає на питання.
Ed S.

@GManNickG Оскільки вектор може бути зручнішим чи з інших причин? Оскільки я часто стикаюся із сторонніми функціями, які вимагають використання масивів замість векторів.
Lèse majesté

5
@ Lèsemajesté Це не причина не використовувати вектори - std::vector::data()функція-член поверне базовий необроблений масив, коли це буде потрібно.
emlai

3
@zenith: Зазвичай ви використовуєте, operator&а не data()отримуєте вказівник з вектора, але це правда, що вектор забезпечує гарантію суміжності, необхідну для сумісності з функціями, що очікують масиви.
Бен Войгт

3

Як тільки питання стосується динамічного масиву, можливо, вам захочеться не просто створити масив із змінним розміром, але і змінити його розмір під час виконання. Ось приклад з memcpy, ви можете використовувати memcpy_sабо std::copyяк добре. Залежно від компілятора, <memory.h>або <string.h>може знадобитися. Використовуючи ці функції, ви виділяєте нову область пам'яті, копіюєте в неї значення оригінальних областей пам'яті, а потім вивільняєте їх.

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

Ви можете використовувати константу 4 замість sizeof(int).


1

динамічно розподіляти пам’ять, використовуючи new:

int* array = new int[SIZE];

2
Ймовірно, вам не вистачає двокрапки або ви не замінили SIZE на справжній розмір.
Montdidier

5
Чому має бути точка з двокрапкою? Це не повне твердження. Декларацій може бути більше. Якщо це включено в повну програму, це відповідає тому, що просив ОП.
Бенджамін Ліндлі,

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

Вищезазначений код працює, максимальний розмір плаваючого або масиву int, який можна було визначити, мав розмір 2095879, а умовою виходу було б ненульове початкове число введення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.