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

Как изменить размер массива с

  • автор:

Изменить размер массива динамически

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

Вы не сможете изменять размер, добавляя неинициализированные элементы, но вы сможете добавить элемент в конец при помощи Add , в начало или середину при помощи Insert , или удалять по индексу при помощи RemoveAt .

Отслеживать
ответ дан 27 окт 2016 в 11:54
206k 28 28 золотых знаков 291 291 серебряный знак 526 526 бронзовых знаков

В вашем примере управляемый массив. Напрямую — никак, только через аллокацию (выделение памяти) нового массива. Например есть метод Array.Resize, внутри он создает новый массив заданного размера, копирует в него содержимое старого массива и возвращает ссылку на новый массив.

Если очень сильно нужно изменить размер неуправляемого массива без аллокации нового — можно воспользоваться нативным классом (функция HeapReAlloc ) из моего вопроса: Инспекция класса для работы с HeapAlloc

Отслеживать
ответ дан 27 окт 2016 в 11:53
507 4 4 серебряных знака 16 16 бронзовых знаков

  • c#
  • массивы
  • динамические-массивы
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как изменить размер массива с

Все массивы в C# построены на основе класса Array из пространства имен System. Этот класс определяет ряд свойств и методов, которые мы можем использовать при работе с массивами. Основные свойства и методы:

  • Свойство Length возвращает длину массива
  • Свойство Rank возвращает размерность массива
  • int BinarySearch (Array array, object? value) выполняет бинарный поиск в отсортированном массиве и возвращает индекс найденного элемента
  • void Clear (Array array) очищает массив, устанавливая для всех его элементов значение по умолчанию
  • void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) копирует из массива sourceArray начиная с индекс sourceIndex length элементов в массив destinationArray начиная с индекса destinationIndex
  • bool Exists (T[] array, Predicate match) проверяет, содержит ли массив array элементы, которые удовлеворяют условию делегата match
  • void Fill (T[] array, T value) заполняет массив array значением value
  • T? Find (T[] array, Predicate match) находит первый элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null
  • T? FindLast (T[] array, Predicate match) находит последний элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null
  • int FindIndex (T[] array, Predicate match) возвращает индекс первого вхождения элемента, который удовлеворяет определенному условию делегата match
  • int FindLastIndex (T[] array, Predicate match) возвращает индекс последнего вхождения элемента, который удовлеворяет определенному условию
  • T[] FindAll (T[] array, Predicate match) возвращает все элементы в виде массива, которые удовлеворяет определенному условию из делегата match
  • int IndexOf (Array array, object? value) возвращает индекс первого вхождения элемента в массив
  • int LastIndexOf (Array array, object? value) возвращает индекс последнего вхождения элемента в массив
  • void Resize (ref T[]? array, int newSize) изменяет размер одномерного массива
  • void Reverse (Array array) располагает элементы массива в обратном порядке
  • void Sort (Array array) сортирует элементы одномерного массива

Разберем самые используемые методы.

Поиск индекса элемента

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // находим индекс элемента "Bob" int bobIndex = Array.BinarySearch(people, "Bob"); // находим индекс первого элемента "Tom" int tomFirstIndex = Array.IndexOf(people, "Tom"); // находим индекс последнего элемента "Tom" int tomLastIndex = Array.LastIndexOf(people, "Tom"); // находим индекс первого элемента, у которого длина строки больше 3 int lengthFirstIndex = Array.FindIndex(people, person => person.Length > 3); // находим индекс последнего элемента, у которого длина строки больше 3 int lengthLastIndex = Array.FindLastIndex(people, person => person.Length > 3); Console.WriteLine($"bobIndex: "); // 2 Console.WriteLine($"tomFirstIndex: "); // 0 Console.WriteLine($"tomLastIndex: "); // 4 Console.WriteLine($"lengthFirstIndex: "); // 3 Console.WriteLine($"lengthLastIndex: "); // 5

Если элемент не найден в массиве, то методы возвращают -1.

Поиск элемента по условию

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // находим первый и последний элементы // где длина строки больше 3 символов string? first = Array.Find(people, person => person.Length > 3); Console.WriteLine(first); // Kate string? last = Array.FindLast(people, person => person.Length > 3); Console.WriteLine(last); // Alice // находим элементы, у которых длина строки равна 3 string[] group = Array.FindAll(people, person => person.Length == 3); foreach (var person in group) Console.WriteLine(person); // Tom Sam Bob Tom

Изменение порядка элементов массива

Например, изменим порядок элементов:

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; Array.Reverse(people); foreach (var person in people) Console.Write($" "); // "Alice", "Tom", "Kate", "Bob", "Sam", "Tom"

Также можно изменить порядок только части элементов:

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // изменяем порядок 3 элементов начиная c индекса 1 Array.Reverse(people, 1, 3); foreach (var person in people) Console.Write($" "); // "Tom", "Kate", "Bob", "Sam", "Tom", "Alice"

В данном случае изменяем порядок только 3 элементов начиная c индекса 1.

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

Для изменения размера массива применяется метод Resize. Его первый параметр — изменяемый массив, а второй параметр — количество элементов, которые должны быть в массиве. Если второй параметр меньше длины массива, то массив усекается. Если значение параметра, наоборот, больше, то массив дополняется дополнительными элементами, которые имеют значение по умолчанию. Причем первый параметр передается по ссылке:

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // уменьшим массив до 4 элементов Array.Resize(ref people, 4); foreach (var person in people) Console.Write($" "); // "Tom", "Sam", "Bob", "Kate"

Копирование массива

Метод Copy копирует часть одного массива в другой:

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; var employees = new string[3]; // копируем 3 элемента из массива people c индекса 1 // и вставляем их в массив employees начиная с индекса 0 Array.Copy(people,1, employees,0, 3); foreach (var person in employees) Console.Write($" "); // Sam Bob Kate

В данном случае копируем 3 элемента из массива people начиная c индекса 1 и вставляем их в массив employees начиная с индекса 0.

Сортировка массива

Отсортируем массив с помощью метода Sort() :

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; Array.Sort(people); foreach (var person in people) Console.Write($" "); // Alice Bob Kate Sam Tom Tom

Этот метод имеет много перегрузок. Например, одна из версий позволяет отсортировать только часть массива:

var people = new string[] < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // сортируем с 1 индекса 3 элемента Array.Sort(people, 1, 3); foreach (var person in people) Console.Write($" "); // Tom Bob Kate Sam Tom Alice

click fraud protection

Как только массив выделен, в языке программирования C++ нет встроенного механизма для изменения его размера. Поэтому мы можем избежать этой проблемы, динамически генерируя новый массив, копируя содержимое и затем удаляя старый массив. В этой статье основное внимание уделяется тому, как динамически выделять память в массиве и настраивать размер массива на основе пользовательского ввода. Это очень важная стратегия в программировании, поскольку она обеспечивает эффективное использование памяти. Когда мы пытаемся вставить новый элемент в динамический массив, он автоматически увеличивается до тех пор, пока для нового элемента не останется места для хранения. Как правило, область увеличивается в два раза.

Что такое динамический массив?

Динамический массив внешне идентичен стандартному массиву, но его размер можно изменить во время выполнения кода. Компоненты Dynamic Array занимают непрерывный блок памяти. После определения массива невозможно изменить его размер. Напротив, динамический массив не похож на статический массив. Даже после того, как он был занят, динамический массив может увеличить свой размер. Элементы можно постоянно добавлять в конечной позиции динамического массива, используя зарезервированное пространство до тех пор, пока оно не будет полностью занято.

Ключевые факторы динамического массива в C++:

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

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

Пример 1:

Новое ключевое слово используется для построения динамического массива в следующей программе C++. После этого ключевое слово возвращает ссылку на первый элемент. В разделе заголовка есть включенный файл библиотеки iostream для использования его методов. Также включен файл пространства имен, который позволяет использовать его класс без вызова. Затем вызывается основная функция, в которой мы объявили две переменные «p» и «num» целочисленного типа данных.

На следующем шаге оператор cout печатает оператор «Введите числа». Команда cin принимает ввод от пользователя и размещает его в переменной «num». Следующий шаг имеет переменную-указатель «Array», которая содержит целые значения переменной «num». Введенный пользователем номер будет напечатан с помощью команды cout. Тогда у нас есть для условия цикла который перебирает каждый элемент, введенный пользователем. Массив как «массив» объявляется в команде cin, которая считывает ввод, введенный пользователем.

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

используя пространство имен std ;
инт главный ( ) <
инт п , число ;
cout число ;
инт * Множество = новый инт ( число ) ;
cout за ( п = 0 ; п > Множество [ п ] ;
>
cout за ( п = 0 ; п < число ; п ++ ) <
cout >
cout возвращаться 0 ;
>

Пользователю предлагается ввести число в приглашении консоли. После ввода число для размера массива отображает числа заданного размера массива. Результирующий массив отображается в командной строке Ubuntu.

Пример 2:

Список инициализаторов можно использовать для установки динамического массива. Давайте проиллюстрируем это на примере, чтобы увидеть, как это работает. Во-первых, мы добавили файл iostream и файл пространства имен std в раздел заголовка. После этого мы вызвали основную функцию. Логика программы должна быть включена в тело функции. Затем мы определили переменную как «a» целочисленного типа данных.

После объявления целочисленной переменной у нас есть объявление динамического массива как «Arr», в котором используется список инициализаторов. У нас есть четыре целочисленных элемента в массиве. Команда cout напечатает оператор «Элементы массива» перед отображением элементов массива.

На следующем шаге имеем цикл for который перебирает элементы, присутствующие в указанном массиве. С помощью команды cout элементы заданного массива будут напечатаны в командной строке консоли.

Ниже приведен результат, который мы получили в результате выполнения вышеуказанной программы.:

Пример 3:

Как только цель динамического массива достигнута, его следует удалить из памяти компьютера. Для этого можно использовать выражение удаления, чтобы освободить место в памяти и использовать его для хранения дополнительных данных. Мы должны использовать delete[] для удаления динамического массива из памяти системы. Квадратная скобка [] с ключевым словом delete указывает процессору удалить множество переменных, а не только одну.

Приступим к реализации программы. Мы импортировали нужный файл в раздел заголовка. Затем вызывается основная функция. Целочисленные переменные «i» и «no» объявлены в основной функции. После определения этих переменных у нас есть оператор cout «Введите номер», который позволяет пользователю ввести номер. Получаем от пользователя число и сохраняем его в переменной «no» с помощью команды cin.

Затем объявите переменную-указатель «MyArr», которая хранит целые числа в памяти. Число, введенное пользователем, будет напечатано во второй команде cout этой программы. для петли оператор используется для итерации по введенному пользователем номеру. В итоге мы построили оператор delete[], который стирает заданный в программе массив и освобождает место в памяти.

используя пространство имен std ;
инт главный ( ) <
инт я , нет ;
cout нет ;
инт * МояАрр = новый инт ( нет ) ;
cout за ( я = 0 ; я > МояАрр [ я ] ;
>
cout за ( я = 0 ; я < нет ; я ++ ) <
cout >
cout Удалить [ ] МояАрр ;
возвращаться 0 ;
>

После выполнения программы мы получили следующий вывод. Когда программа завершится, массив будет удален.

Пример 4:

Мы можем динамически определить массив указателей размера «X», а затем динамически выделить память размера «Y» для каждой строки, как показано в следующем примере. Сначала мы определили матрицу в разделе заголовка. На следующем шаге у нас есть основная функция, в которой у нас есть переменная-указатель «arr». Переменная-указатель содержит массив размера «X».

Сейчас оператор цикла for выделяет каждой строке размер памяти «Y». Затем у нас есть вложенный цикл для динамического присвоения значений выделенной памяти. Функция rand сгенерирует случайное число для двумерного массива. В следующем вложенном цикле мы напечатали двумерный массив с помощью оператора std:: cout. По завершении программы указанный 2D-массив будет стерт из выделенного пространства памяти, так как мы использовали delete[] в конце.

# определить X 3
# определить Y 4
инт главный ( )
<
инт ** обр = новый инт * [ Икс ] ;
за ( инт я = 0 ; я < Икс ; я ++ ) <
обр [ я ] = новый инт [ Д ] ;
>
за ( инт я = 0 ; я < Икс ; я ++ )
<
за ( инт Дж = 0 ; Дж < Д ; Дж ++ ) <
обр [ я ] [ Дж ] = ранд ( ) % 10 ;
>
>
за ( инт я = 0 ; я < Икс ; я ++ )
<
за ( инт Дж = 0 ; Дж < Д ; Дж ++ ) <
станд. :: cout >
станд. :: cout >
за ( инт я = 0 ; я < Икс ; я ++ ) <
Удалить [ ] обр [ я ] ;
>
Удалить [ ] обр ;

Двумерный массив был сгенерирован и показан на экране консоли ниже.

Вывод

Речь идет об массиве с измененным размером в C++. Мы узнали, что массивы C++ не имеют встроенного метода изменения размера. Но с помощью динамического выделения массива в С++ размер массива можно изменить. В примере мы показали изменение размера динамического массива с помощью нового ключевого слова. Кроме того, мы можем использовать список инициализаторов для инициализации массива. После изменения размера мы также можем освободить место в памяти с помощью удаления []. Эта статья покажет вам, как изменить размер массива в 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; >

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

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

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

Adamos

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

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

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