Как увеличить динамический массив c
Перейти к содержимому

Как увеличить динамический массив c

  • автор:

Увеличение размера динамического массива c-style строк

@HasmikGaryaka, копировать строки необязательно, можно скопировать лишь указатели. Он, ведь, хочет расширить массив, а не сделать его копию. А значит, старые указатели вполне могут перекочевать в новый массив.

2 окт 2017 в 16:54

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Да, в общем-то, все то же самое:

  • Создаете новый массив new char*[sz*2];
  • В него копируете указатели на с-строки из старого массива;
  • Убиваете старый массив;
  • Возвращаете указатель на новый массив.

Только имейте в виду: что в примере с int, что со строками, новые элементы (те, что не скопированы) остаются неинициализированными (мусор). По-хорошему их надо инициализировать.

Увеличение динамического массива в С++

Возникла проблемка которая не дает мне спокойствия. Суть такова, есть указатель на целое int *a;Затем выделяем память, а=new int[10]; потом, заполнили его в цикле числами. И тут мне надо еще добавить ячеек в массив а, что бы туда записать числа, можно конечно через временный массив но мне не хотеться. Когда так делаю а=new int[20]; то вся информация что была раньше исчезает. Как увеличить массив без потери данных? Заранее спасибо!
Пример

int *a;
a =new int [10];

a=new int [20];//тут вся информация исчезает

11 ответов

01 ноября 2007 года
1.0K / / 08.01.2007
Используй вектор.

int _tmain(int argc, _TCHAR* argv[])
vector coll;
for(int i = 0;i < 10;++i)
coll.push_back(i);
coll.push_back(10);
coll.push_back(22);
for(int i = 0;i < coll.size();++i)
cout cout return 0;
>

02 ноября 2007 года
68 / / 01.11.2007

m_Valery cпасибо что откликнулся и сразу же вопрос. В vector –е можно использовать структуры(vector), просто я привел простейший пример, а мне надо массив структур увеличивать. Как с этим быть?

02 ноября 2007 года
277 / / 11.10.2006
естественно можно:-)
struct sHosts
string hostname;
string nserver;
string devid;
string fixaddr;
>;
vectorhosts;
02 ноября 2007 года
2.5K / / 14.07.2006

Можно исспользовать любой тип. Главное чтобы для него были определенны оператор присваивания и конструктор копирования.

Ну или можно исспользовать указатель на тип (который сам по себе тип но у него есть оператор присваивания). ))

02 ноября 2007 года
1.1K / / 19.09.2006
Когда так делаю а=new int[20]; то вся информация что была раньше исчезает.

Информация не исчезает, а просто становится недоступной, потому что выделяется новый блок, но в программе отсутствует указатель на старый блок — утечка памяти.
Для простых типов данных можно использовать функцию realloc

// выделяем блок памяти под 10 элементов размером с int (4*10 байт)
int *array = (int*) malloc (10 * sizeof (int));
// изменяем размер блока выделенной памяти
array = (int*) realloc (array, 20 * sizeof (int));
// освобождаем память
free (array)

При увеличении блока, функция может выполнить перемещение данных в бо’льшую область памяти.
Данные функции не обнуляют выделенную память и не вызывают ни конструкторы, ни деструкторы (в отличие от new[] и delete[]) — поэтому их очень сложно использовать для сложных типов..

03 ноября 2007 года
68 / / 01.11.2007
Всем спасибо помогли хорошенько
27 августа 2010 года
2 / / 27.08.2010

Я постоянно работаю с динамическими массивами в Object Pascal и PHP. Вот внезапно возникла необходимость использования языка C++ и пришлось немного почесать голову )). :confused:

Библиотека это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке. А ведь C++ самый успешный и развивающийся язык программирования.

Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива сужаются к двум:
1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);
2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).

А для Object Pascal преимущества динамического массива увеличиваются как минимум на два:
3. не занимает памяти, пока массив не востребован, т.е. не задана длинна (большой бонус, поскольку переменные объявляются только в разделе var и занимают память от начала алгоритма);
4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).

Резонные вопросы:
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека (бред какой-то)? 😮

Ответы на свои вопросы искал заранее, но нигде ничего не нашел. Может Вы, где что видели или знаете? Заранее благодарен. :rolleyes:

27 августа 2010 года
452 / / 12.08.2009

шаблонный класс vector находится в STL, что расшифровывается как Standart Template Libraty(стандартная библиотека шаблонов).

1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?

я Паскале я не силён. но подозреваю что скорее всего неявно производится выделение новой памяти(при расширении массива) и перенос массива туда.
вообще говоря, нельзя просто так нарастить длинну массива, потому что элементы любого массива располагаются в памяти последовательно, а гарантий того, что последующие ячейки памяти не будут заняты — нет.

2. или забросили и недоделали данную операцию в С++ поскольку была библиотека (бред какой-то)?

C++ — это использование STL для работы с контейнерами.
операции new и delete растут из Си с malloc и free

в vector расширение памяти под хранимые объекты можно производить как явно, так и не явно, так что всё есть в C++

Как увеличить размер массива в C++?

Подскажите пожалуйста примерную идею,как можно увеличить размер массива на с++.
Задача такова,что есть динамический массив,который пользователь заполняет.Далее,нужно написать функцию,которая добавляет элемент к массиву только в том случае,если этот елемент отсутствует. Написал вот такую функцию:

int* addItemToArray(int* array, int size, int newItem) < for (int i = 0; i < size; i++)< if (newItem == *(array + i))< return nullptr; >> int* newArray = new int[size + 1]; for (int i = 0; i < size; i++)< *(newArray+i) == *(array + i); >*(newArray + size + 1) = newItem; return newArray; >

Она возвращает адрес нового массива,далее пытаюсь принять этот результат:

int L,I; cout > L; int* lineArray = new int[L]; srand(time(0)); for (int j = 0; j < L; j++)< cout > I; > cout > I; while ((lineArray = addItemToArray(lineArray, sizeof(lineArray) / sizeof(lineArray[0]), 4)) == nullptr)< cout > I; >

Но он мне возвращает нулевой адрес.На сколько я понимаю,это происходит из за того,что время жизни моего нового массива заканчивается на выходе из функции. Как это побороть?

  • Вопрос задан более трёх лет назад
  • 8571 просмотр

Комментировать
Решения вопроса 1

Adamos

1. Вы сами себя путаете, используя *(array + i) вместо array[i]
2. Вы создаете новый массив, не удаляя старый. Понятно, что в лабораторной это не критично. Но если вы собрались жить с С++, то либо вам будут резать глаз такие вещи, либо учите другой язык.
3. У вас есть функция, в которую передается массив и элемент. Функция возвращает либо новый массив, либо nullptr. Это противоестественно. Функция должна возвращать ссылку на массив — а новый он или старый, можно решать вне функции. Это кажется неважным, но хороший код базируется именно на таких мелочах, а говнокод растет именно из-за того, что «здесь же и так все понятно».
4. Наконец, в программе трэш. Запрашиваются значения для массива, но они не вводятся в сам массив. В массив добавляется не введенное значение, а 4 (?). lineArray сразу же теряется, поскольку ему присваивается nullptr.

Динамическое распределение массивов в C++ на примере

Динамический массив очень похож на обычный массив, но его размер можно изменить во время выполнения программы. Элементы DynamArray занимают непрерывный блок памяти.

После создания массива его размер нельзя изменить. Однако динамический массив отличается. Динамический массив может увеличивать свой размер даже после заполнения.

При создании массива ему выделяется заранее определенный объем памяти. Это не относится к динамическому массиву, поскольку при необходимости размер памяти увеличивается на определенный коэффициент.

Факторы, влияющие на производительность динамических массивов

Начальный размер массива и коэффициент его роста определяют его производительность. Обратите внимание на следующееwing точки:

  1. Если массив имеет небольшой размер и небольшой коэффициент роста, он будет чаще перераспределять память. Это снизит производительность массива.
  2. Если массив имеет большой размер и большой коэффициент роста, у него будет огромный кусок неиспользуемой памяти. В связи с этим изменить размер operaции могут занять больше времени. Это снизит производительность массива.

Новое ключевое слово

В C++ мы можем создать динамический массив, используя ключевое слово new. Количество распределяемых элементов указывается в паре квадратов brackets. Имя типа должно предшествовать этому. Запрошенное количество предметов будет выделено.

Синтаксис

Новое ключевое слово принимает следующееwing синтаксис:

pointer_variable = new data_type;

Pointer_variable — это имя указатель переменной.

data_type должен быть допустимым типом данных C++.

Затем ключевое слово возвращает указатель на первый элемент. После создания динамического массива мы можем удалить его с помощью ключевого слова delete.

Пример 1:

#include using namespace std; int main() < int x, n; cout >n; int *arr = new int(n); cout > arr[x]; > cout return 0; >

Вывод:

Новое ключевое слово

Вот скриншот кода:

Новое ключевое слово

Пояснение к коду:

  1. Включите заголовочный файл iostream в нашу программу, чтобы использовать его. Функции.
  2. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  3. Вызовите функцию main(). Логику программы следует добавлять в тело функции.
  4. Объявите две целочисленные переменные x и n.
  5. Выведите на консоль текст, предлагающий пользователю ввести значение переменной n.
  6. Прочитайте ввод пользователя с клавиатуры и присвойте его переменной n.
  7. Объявите массив для хранения n целых чисел и присвойте его переменной-указателю *arr.
  8. Распечатайте сообщение, предлагающее пользователю ввести n элементов.
  9. Используйте цикл for, чтобы создать переменную цикла x для перебора элементов, введенных пользователем.
  10. Чтение введенных пользователем элементов и сохранение их в массиве arr.
  11. Конец тела для цикла.
  12. Напечатайте текст на консоли.
  13. Используйте цикл for, чтобы создать переменную цикла x для перебора элементов массива.
  14. Выведите на консоль значения, содержащиеся в массиве с именем arr.
  15. Конец тела цикла for.
  16. Программа должна вернуть значение после успешного завершения.
  17. Конец тела функции main().

ПРИМЕЧАНИЕ. В приведенном выше примере пользователю разрешено указывать любой размер массива во время выполнения. Это означает, что размер массива определяется во время выполнения..

Инициализация динамически выделяемых массивов

Динамический массив легко инициализировать значением 0.

Синтаксис:

int *array < new int[length]<>>;

В приведенном выше синтаксисе длина обозначает количество элементов, добавляемых в массив. Поскольку нам нужно инициализировать массив значением 0, его следует оставить пустым.

Мы можем инициализировать динамический массив, используя список инициализаторов. Давайте создадим пример, демонстрирующий это.

Пример 2:

#include using namespace std; int main(void) < int x; int *array< new int[5]< 10, 7, 15, 3, 11 >>; cout return 0; >

Вывод:

Вот скриншот кода:

Инициализация динамически выделяемых массивов

Пояснение к коду:

  1. Включите заголовочный файл iostream в нашу программу, чтобы использовать его функции.
  2. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  3. Вызовите функцию main(). Логику программы следует добавлять в тело функции.
  4. Объявите целочисленную переменную с именем x.
  5. Объявите динамический массив с именем array, используя список инициализаторов. Массив будет содержать 5 целочисленных элементов. Обратите внимание, что мы не использовали знак « code-block code-block-4″ style=»margin: 8px 0; clear: both;»>

Изменение размера массивов

Длина динамического массива устанавливается во время выделения. Однако в C++ нет встроенного механизма изменения размера массива после его выделения. Однако вы можете решить эту проблему, динамически выделив новый массив, скопировав элементы, а затем удалив старый массив. Примечание: этот метод подвержен ошибкам, поэтому старайтесь его избегать.

Динамическое удаление массивов

Динамический массив должен быть удален из памяти компьютера, как только его цель будет достигнута. Оператор удаления может помочь вам в этом. Освободившееся пространство памяти затем можно использовать для хранения другого набора данных. Однако даже если вы не удалите динамический массив из памяти компьютера, он будет удален автоматически после завершения работы программы. Примечание: Чтобы удалить динамический массив из памяти компьютера, вместо delete следует использовать delete[]. [] указывает процессору удалить несколько переменных, а не одну переменную. Использование delete вместо delete[] при работе с динамическим массивом может привести к проблемам. Примеры таких проблем включают утечки памяти, повреждение данных, сбои и т. д.

Пример 3:

#include using namespace std; int main() < int x, n; cout >n; int *arr = new int(n); cout > arr[x]; > cout cout

Вывод:Динамическое удаление массивов Вот скриншот кода: Динамическое удаление массивовПояснение к коду:

  1. Включите заголовочный файл iostream в нашу программу, чтобы использовать его функции.
  2. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  3. Вызовите функцию main(). Логику программы следует добавлять в тело функции.
  4. Объявите две переменные x и n целочисленного типа данных.
  5. Напечатайте текст на консоли. В тексте пользователю будет предложено указать количество numbers они войдут.
  6. Чтение ввода пользователя с клавиатуры. Входное значение будет присвоено переменной n.
  7. Объявите переменную-указатель *arr. Массив arr зарезервирует некоторую память для хранения в общей сложности n целых чисел.
  8. Распечатайте сообщение на консоли, предлагающее пользователю ввести n numbers.
  9. Создайте цикл for и переменную цикла x для перебора numbers введенный пользователем.
  10. Читать numbers введённые пользователем и сохраняющие их в массиве обр.
  11. Конец тела цикла for.
  12. Напечатайте текст на консоли.
  13. Используйте цикл for и переменную цикла x для перебора содержимого массива arr.
  14. Распечатайте значения массива arr на консоли.
  15. Конец тела цикла for.
  16. Выведите пустую строку на консоль.
  17. Освободите память массива обр.
  18. Программа вернет значение после успешного завершения.
  19. Конец тела функции main().

Обзор

  • Обычные массивы имеют фиксированный размер. Вы не можете изменить их размер после объявления.
  • Для этих типов массивов размер памяти определяется во время компиляции.
  • Динамические массивы разные. Их размеры могут быть изменены во время выполнения.
  • В динамических массивах размер определяется во время выполнения.
  • Динамические массивы в C++ объявляются с использованием ключевого слова new.
  • Мы используем квадрат brackets чтобы указать количество элементов, которые будут храниться в динамическом массиве.
  • Закончив с массивом, мы можем освободить память, используя команду delete. operaтор.
  • Используйте удаление operator с [] для освобождения памяти всех элементов массива.
  • Удаление без [] освобождает память только для одного элемента.
  • В C++ нет встроенного механизма изменения размера массивов.
  • Чтобы инициализировать массив с помощью инициализатора списка, мы не используем знак «=». operaтор.
  • std::list в C++ с примером
  • Как загрузить и установить C++ IDE на Windows
  • Программа Hello World на C++ с объяснением кода
  • Переменные и типы C++: Int, Char, Float, Double, строка и логическое значение
  • Учебник по C++ для начинающих: изучите основы программирования за 7 дней
  • Разница между структурой и классом в C++
  • Учебное пособие по C++ в формате PDF для начинающих (загрузить сейчас)
  • Статическая функция-член в C++ (примеры)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *