Как создать динамический массив целых чисел

85

Как создать динамический массив целых чисел на C ++ с помощью newключевого слова?

Суданта
источник
12
Вы используете std::vector<int>. И книгу .
GManNickG
как вы назначаете и получаете доступ к его данным после инициализации?
Взгляните на этот пост, здесь он подробно
описан
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, integer% 20from% 20the% 20heap ...
Nagappa

Ответы:

128
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Не забывайте о deleteкаждом массиве, который вы выделяете new.

Джейсон Айверсон
источник
28
Я не буду -1, но если вы даже можете забыть об этом delete, ваш код неверен.
GManNickG
2
Спустя 8 лет этот комментарий может смутить новичков @GManNickG, как насчет его удаления (поскольку я полагаю, что это было сделано до того, как Джейсон Айверсон фактически удалил массив)?
gsamaras
2
@gsamaras: Согласен, это сбивает с толку, но все же верно: в вашем коде не должно быть ручного удаления, о котором вы должны помнить, чтобы не забыть. То есть использовали умные указатели и другие контейнеры.
GManNickG
1
@GManNickG Я думаю, ваш комментарий может быть менее догматичным. Код правильный, даже если он не идеален. Умные указатели и контейнеры почти всегда являются лучшим вариантом (особенно в таких вопросах для начинающих), но не всегда.
Спенсер
Я согласен с @Spencer, код не ошибочный, он простой, идеальный c ++. Вы можете сказать, что есть альтернатива, называть ее лучшими практиками и т. Д. Но в этом примере как таковом нет ничего плохого.
Арман
67

Начиная с 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. Запоминать все эти новые выражения сложно.
Кея Керстинг,
31

Возможно, вы захотите рассмотреть возможность использования стандартной библиотеки шаблонов. Он прост и удобен в использовании, к тому же вам не нужно беспокоиться о выделении памяти.

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
источник
8
@Ed, ограничение в вопросе кажется довольно произвольным. std::vectorс соответствующим конструктором работает очень хорошо, и его следует указать в качестве альтернативы. Иногда люди задают вопрос плохо, и это может считаться одним из таких случаев - он очень краткий и не дает никаких оснований для предпочтения new.
Марк Рэнсом,
3
@Ed: Нет причин использовать new[]вместо std::vector.
GManNickG
2
@baash: В C ++ нет причин. Если вы по какой-то причине решите «удалить стандартную библиотеку», вы больше не будете программировать на C ++. Мой комментарий относится к языку C ++, а не к языку C ++, который мы используем на моем устройстве. Даже в этом случае вам не нужно deleteничего делать вручную. Кроме того, std::vectorэто динамический массив, который ничего не делает со связанным списком. Это просто обертка вокруг куска памяти.
GManNickG
1
@Montdidier: Нет. Вы все еще используете newи deleteдля реализации оберток. Дело в том, что вы не управляете ресурсом и не используете его, вы делаете то или другое.
GManNickG
1
@Montdidier: Начнем с утверждений: в C ++ все экземпляры new[]можно заменить на std::vector. И поскольку std::vectorправильно отделяет управление ресурсами от использования ресурсов (SBRM), мы должны это сделать.
GManNickG
6
int* array = new int[size];
Эд С.
источник
2
Он просто отвечает на вопрос.
Эд С.
@GManNickG Потому что вектор может быть удобнее или по другим причинам? Потому что я часто сталкиваюсь с функциями сторонних разработчиков, которые требуют использования массивов вместо векторов.
Lèse Majesté
5
@ Lèsemajesté Это не причина не использовать векторы - std::vector::data()функция-член вернет базовый необработанный массив, когда это необходимо.
emlai
3
@zenith: Как правило, вы бы использовали operator&вместо того, data()чтобы получать указатель из вектора, но верно, что вектор обеспечивает гарантию непрерывности, необходимую для совместимости с функциями, ожидающими массивы.
Ben Voigt
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];
Montdidier
источник
2
Вероятно, у вас отсутствует двоеточие или вы не заменили SIZE фактическим размером.
Montdidier
5
Почему должна быть точка с запятой? Это не полное заявление. Может быть еще деклараций. Это, если оно включено в полную программу, делает то, что попросил OP.
Бенджамин Линдли,
-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;
}

Приведенный выше код работает, максимальный размер массива с плавающей запятой или int, который можно было определить, был размером 2095879, а условием выхода было бы ненулевое начальное число ввода

Shawndfernandes
источник
Это не имеет ничего общего с вопросом о динамическом массиве.
Ben Voigt