Уменьшить размер динамического массива несколько раз
А если, например, уменьшать нужно последовательно в теле цикла большое количество раз, то как поступить?
Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
задан 1 июн 2018 в 16:41
758 5 5 серебряных знаков 20 20 бронзовых знаков
Лучше возьмите std::vector , тогда достаточно будет сделать resize() , shrink_to_fit() .
1 июн 2018 в 18:41
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Много раз перераспределять память и копировать элементы ни к чему. Вместо этого завести переменную, содержащую размер активной области, и уменьшать её.
А вот когда она, например, станет 1/2 или 1/4 от реального размера, тогда уже можно и выполнить реальное изменение размера.
Подобная тактика применяется и при расширении массива — сразу выделяется память с запасом, например, в полтора или два раза, и большую часть времени просто инкрементируется переменная, отвечающая за размер.
DELPHI ИЗМЕНИТЬ РАЗМЕР МАССИВА
В Delphi можно изменить размер массива с помощью процедуры SetLength . Данная процедура принимает два параметра: массив, который нужно изменить, и новую длину массива. При уменьшении размера массива данные, которые выходят за пределы нового размера, обрезаются. При увеличении размера массива все новые элементы инициализируются значениями по умолчанию.
var
arr: array[0..4] of Integer; // объявление массива размером 5
begin
SetLength(arr, 10); // увеличение размера массива до 10 элементов
end;

Программирование в Delphi Урок 5. Массивы и циклы, цикл for, глобальные переменные. Array
Урок №6 — Массивы (Часть 2 — двухмерный массив) — EmbarCadero RAD Studio 10.3
Динамический массив с++ пример. Создание, заполнение, удаление, размер динамического массива. #55
DELPHI Урок 3 Создание БД, добавление, удаление, изменение записей
#6 Программирование в Delphi. Массивы
Двумерный динамический массив c++ пример. Создание, заполнение, удаление. Динамические массивы. #56
3 урок Delphi XE (уменьшить размер проэкта)
#5. Динамический массив. Принцип работы — Структуры данных
Как уменьшить длину массива си
Рейтинг (т): 1
В Шилдте в для закрепления теория по индексаторам и свойствам рекомендуют в качестве упражения создать класс динамический массив. Но у меня возник вопрос, как лучше изменять размер массива — распределять память в свойстве Length массива или использовать отдельный метод, который будет вызыватся в свойстве Length и распределять память под другой размер массив. Возможно оба способа плохие, вы можете подсказать как лучше всего сделать. Вот как я реализовал это с помощью отдельного метода.
Класс DynamicArray
class DynamicArray
private int[] a;
private int len;
public DynamicArray(int size)
a = new int[size];
public bool Error < get; private set; >
public int Length
Console.WriteLine(«Длина массива меньше 0»);
Error = true;
Error = false;
return len;
Error = true;
Error = false;
len = value;
public int this[int index]
if (ok(index))
Error = false;
return a[index];
Error = true;
if (ok(index))
Error = false;
a[index] = value;
Error = true;
Класс DynamicArrayDemo
class DynamicArrayDemo
static void Main()
DynamicArray array = new DynamicArray(10);
Random r = new Random();
//int size = 0;
Console.WriteLine(«Длина массива до изменения: » + array.Length);
for (int i = 0; i < array.Length; i++)
Как уменьшить длину массива си
Нужно уменьшить размер массива
int size_a = 10;
int *a = new int[size_a];
Если нужно уменьшить один раз, то всё понятно: создаём ещё один массив, копируем элементы, старый удаляем
int size_b=size_a-1;
int *b = new int[size_b];
for (i=0;i <=size_b;i++)
b[i]=a[i];
delete[] a;
А если, например, уменьшать нужно последовательно в теле цикла большое количество раз, то как поступить?
| novuiPolzovatel |
| Посмотреть профиль |
| Найти ещё сообщения от novuiPolzovatel |
Форумчанин
Регистрация: 09.05.2017
Сообщений: 718
Так, может-быть, тогда и не уменьшать его динамически, а просто записывать меньшее количество элементов. Память — это не игрушка, все-таки.
Форумчанин
Регистрация: 24.01.2011
Сообщений: 774
Дык может, они пишут shrink_to_fit какой-нибудь.
a.k.a. Angelicos Phosphoros
Мой сайт
Регистрация: 01.06.2018
Сообщений: 9
Я новичок, но возможно такая идея поможет:
// 1. Создаем точку входа в массив, с которой будем начинать последовательные изменения int mpos = 0; // Индекс элемента int mi = arr[0]; // Значение индекса элемента for (int i = 1; i < length; i++) if (arr[i] < mi) < mi = arr[i]; mpos = i; >// 2. Создаем новый массив и копируем значения индексов со сдвигом 1 int *arr = new int[length]; for (mpos; mpos < length; mpos++) // Начинаем цикл элементом с нужным значением < if (mpos != length - 1) // Если текущий элемент не равен крайнему элементу массива, копируем данные с соседнего элемента arr[mpos] = arr[mpos + 1]; else break; >/* Второе действие вставляем в условие изменения изначального массива или отдельную функцию или метод класса к примеру, смотря что там за код. Вызывем его на каждое изменение*/
| Похожие темы | ||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Перемешивание двумерного массива несколько раз без повторений | Silveronn | C++ Builder | 0 | 20.05.2015 16:56 |
| Как уменьшить размер фото | nikolj | HTML и CSS | 1 | 27.11.2011 14:53 |
| Размер динамического массива не через Length | Sibedir | Общие вопросы Delphi | 10 | 29.08.2009 21:26 |
| Напомните как задать размер динамического массива | Arassir | Помощь студентам | 4 | 08.03.2009 13:02 |
| уменьшить размер БД MS Access | Кот из Лета | БД в Delphi | 7 | 30.12.2007 13:51 |