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

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

  • автор:

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

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

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

Отслеживать
ответ дан 27 окт 2016 в 11:54
207k 29 29 золотых знаков 295 295 серебряных знаков 529 529 бронзовых знаков

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

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

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

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

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

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

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

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

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

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

// Инициализируем массив с 10 элементами int[] arr = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10>; // Создаем новый массив с 16 элементами int[] newArr = new int[arr.length * 3 / 2 + 1]; // Указываем исходный массив, начало позиции для копирования, // новый массив, позицию для вставки и количество копируемых элементов System.arraycopy(arr, 0, newArr, 0, arr.length); // Свободные ячейки автоматически заполняются нулями System.out.println(Arrays.toString(newArr)); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0] 

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

Все массивы в 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) сортирует элементы одномерного массива

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

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

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

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

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

string[] people = < "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

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

string[] people = < "Tom", "Sam", "Bob", "Kate", "Tom", "Alice" >; // находим индекс первого элемента "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($"tomFirstIndex: "); // 0 Console.WriteLine($"tomLastIndex: "); // 4 Console.WriteLine($"lengthFirstIndex: "); // 3 Console.WriteLine($"lengthLastIndex: "); // 5 // находим индекс элемента "Bob" // для бинарного поиска коллекцию нужно отсортировать Array.Sort(people); // Alice Bob Kate Sam Tom Tom int bobIndex = Array.BinarySearch(people, "Bob"); Console.WriteLine($"bobIndex: "); // 1

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

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

string[] people = < "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

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

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

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

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

string[] people = < "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. Его первый параметр — изменяемый массив, а второй параметр — количество элементов, которые должны быть в массиве. Если второй параметр меньше длины массива, то массив усекается. Если значение параметра, наоборот, больше, то массив дополняется дополнительными элементами, которые имеют значение по умолчанию. Причем первый параметр передается по ссылке:

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

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

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

string[] people = < "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.

Как увеличить размер массива в 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.

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

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