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

Как удалить массив c

  • автор:

Удалить массив С из памяти

Полный текст задания: Даны два массива А и И одинакового размера N. Определить функцию, возвращающую новый массив С того же размера, каждый элемент которого равен сумме элементов массивов А и В с тем же индексом. Исходные массивы передаются в функцию в качестве параметров. Я сделал это следующим образом:

#include using namespace std; int *printarray(int A[], int B[],const int N,int *C) < C = new int[N]; for (int i = 0; i < N; ++i) < C[i] = A[i] + B[i]; >return C; > int main() < int N; setlocale(0, "rus"); cout > N; cout > A[i]; > cout > B[i]; > int* C= new int; cout delete Y; delete A; delete B; delete C; system("pause"); return 0; > 

Программа работает, но преподаватель говорит, что массив С всё равно не удалён. Я уже по-разному пробовал его удалить, но всё бес толку. Помогите разобраться. заранее спасибо.

Отслеживать
задан 22 окт 2019 в 20:24
65 1 1 серебряный знак 5 5 бронзовых знаков

Он ожидает от вас delete [] Y; (и аналогично для остальных массивов) (но по сути, врет. Память вы освобождаете)

Как удалить элемент массива в PHP?

Одним из мощнейших инструментов PHP-разработчика являются массивы. Если вы работали с массивами в других языках программирования (Delphi, Fortrain, C++), то помните, что везде массив надо объявлять, указывая размерность и тип элементов. В PHP всё обстоит иначе.

Дело в том, что в PHP массив не является линейным объектом. Это, по сути, хеш-массив, представляющий собой набор пар — ключей с их значениями.

Теперь давайте посмотрим, как удалять элементы из хеш-массива в PHP. В вышеупомянутых языках программирования для таких действий придётся создавать специальный объект, односвязный либо 2-связный список, бережно выделять и освобождать память, наблюдать за восстановлением связей в списке. Что касается PHP, то тут весь необходимый «менеджмент» спрятан, но всегда готов к применению.

1. Удаляем элемент массива в PHP

Чтобы удалить элемент в PHP, достаточно всего лишь знать его ключ — в таком случае удаление будет сведено к вызову функции unset() :

 
php $a = array('a','b','c'); unset($a[1]); //удаляем элемент с ключом «1» print_r($a); //на экране отобразится: Array ( [0] => a [2] => c ) ?> 

2. Как удалить 1-й элемент массива?

Если не знаем ключ, но знаем, что удалять надо 1-й элемент массива, подойдёт функция array_shift() . Она извлечёт значение 1-го элемента, удалит его из массива и выполнит перенумерацию числовых ключей, начав с нуля.

 
php $stack = array(3 => 'a', 5 => 'b', 'third element' => 'c'); $elm = array_shift($stack); print_r($stack); //на экране отобразится: Array ( [0] => b [third element] => c ) ?> 

В нашем случае 1-й элемент удаляется, а элемент 5 => ‘b’, попадает под перенумерацию. Что касается элементов со строковыми ключами, то их перенумерация не затронет.

3. Как удалить последний элемент массива?

Схожим образом выполняют удаление последнего элемента массива. Для этого в PHP есть функция array_pop() .

 
php $stack = array(3 => 'a', 5 => 'b', 'third element' => 'c'); $elm = array_pop($stack); print_r($stack); //на экране отобразится: Array ( [3] => a [5] => b ) ?> 

После удаления последнего элемента массива в PHP перенумерация оставшихся элементов не выполняется.

4. Как удалить пустые элементы из массива?

Сначала вспомним, что называют пустым элементом. Лучше всего определить «пустое значение» помогает результат работы функции empty() . Функция возвратит true для пустого элемента, причем не только скалярного. Убедимся в этом на примере ниже:

 
php $stack = array(3 => 'a', 5 => 'b', '3rd' => 'c', array(), null, false, 0, '', '0', '00'); foreach ($stack as $k => $v) if (empty($v)) unset($stack[$k]); print_r($stack); //на экране отобразится : Array ( [3] => a [5] => b [3rd] => c [12] => 00 ) ?> 

Итак, мы в цикле проверим каждый элемент массива, используя функцию empty() и удалим пустые элементы. Здесь важно понять, что строковый скаляр ‘0’ — тоже пустой элемент. А вот ’00’ пустым не является.

Если считаете, что поэлементная проверка массива — неоптимальный вариант, воспользуйтесь функцией сравнения массивов в PHP — array_diff() , перечислив с её помощью все элементы, которые считаем «нулевыми»:

 
php $stack = array(3 => 'a', 5 => 'b', '3rd' => 'c', array(), null, false, 0, '', '0', '00', ' '); $stack = array_diff($stack, array(array(), null, false, 0, '', '0', '00', ' ')); print_r($stack); //на экране отобразится: Array ( [3] => a [5] => b [3rd] => c ) ?> 

Очевидно, что данный способ более гибок.

5. Удаляем повторяющиеся элементы массива в PHP

Порой возникает необходимость удалить повторяющиеся элементы массива в PHP. Для решения этой задачи существует специальная функция под названием array_unique() :

 
php $stack = array('a', 'b', 'b', 'c', 'c', 0, '0'); $stack = array_unique($stack); print_r($stack); //на экране отобразится: Array ( [0] => a [1] => b [3] => c [5] => 0 ) ?> 

Из кода видно, что функция удалила из PHP-массива повторяющиеся элементы. При этом функция имеет ещё один параметр, указывающий, как сравнивать элементы.

Возможные типы сравнения: • SORT_REGULAR — сравнение без преобразования типа элементов; • SORT_STRING — сравнение как строки; • SORT_NUMERIC — сравнение как чисел (пытаемся преобразовать в число); • SORT_LOCALE_STRING — сравнение как строки, но с учётом выбранного набора символов.

По умолчанию применяется SORT_STRING. Выбирая типы сравнения, помните, что это важно. Давайте изменим тип в прошлом примере на SORT_NUMERIC:

 
php $stack = array('a', 'b', 'b', 'c', 'c', 0, '0'); $stack = array_unique($stack, SORT_NUMERIC); print_r($stack); //на экране отобразится: Array ( [0] => a ) ?> 

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

Хотите знать о PHP больше? Записывайтесь на курс «Backend-разработчик на PHP»!

PHP. Как удалить элемент из массива

Если вы хотите удалить элемент массива, то вы можете использовать unset() или array_splice().

Также, если у вас есть значение и вы не знаете ключ для удаления элемента, вы можете использовать, array_search() чтобы получить ключ.

Как в PHP удалить элемент массива при помощи unset()

Обратите внимание, что при использовании unset() ключи массива не будут изменяться / переиндексироваться. Если вы хотите переиндексировать ключи, то используйте array_values() после unset(), что приведет к тому, что все ключи будут пронумерованы начиная с 0.

 "a", 1 => "b", 2 => "c"]; unset($array[1]); //↑ Ключ, который нужно удалить ?> 
[ [0] => a [2] => c ] 
При помощи array_splice()

Если вы используете array_splice(), то они будут автоматически переиндексированы, но ассоциативные ключи не изменятся, в отличие от array_values(), где все ключи будут преобразованы в цифровые.

Также в array_splice() необходимо указать смещение, а не ключ!

 "a", 1 => "b", 2 => "c"]; array_splice($array, 1, 1); //↑ Смещение, которое нужно удалить ?> 
[ [0] => a [1] => c ] 

array_splice() это же самое, что unset() – взять массив по ссылке. Это означает, что вы не хотите присваивать возвращаемые значения этих функций обратно в массив.

Удалить несколько элементов массива

Если вы хотите удалить несколько элементов массива и не хотите вызывать unset() или array_splice() несколько раз, вы можете использовать функции array_diff() или в array_diff_key() зависимости от того, знаете ли вы значения или ключи элементов, которые вы хотите удалить.

При помощи array_diff()

Если вам известны значения элементов массива, которые вы хотите удалить, то вы можете их использовать array_diff(). Как и раньше, unset() не будет изменять / переиндексировать ключи массива.

 "a", 1 => "b", 2 => "c"]; $array = array_diff($array, ["a", "c"]); //└────────┘→ Значения массива, которые нужно удалить ?> 
[ [1] => b ] 
При помощи array_diff_key()

Если вы знаете ключи элементов, которые вы хотите удалить, то вы можете использовать array_diff_key().

Здесь вы должны убедиться, что вы передаете ключи как ключи во втором параметре, а не как значения. В противном случае вы должны перевернуть массив при помощи array_flip(). Тогда ключи не будут меняться /переиндексироваться.

 "a", 1 => "b", 2 => "c"]; $array = array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑ Ключи массива, которые нужно удалить ?> 
[ [1] => b ] 

Если вы хотите использовать unset() или array_splice() чтобы удалить несколько элементов с одинаковым значением, то вы можете использовать, array_keys() чтобы получить все ключи для определенного значения, а затем удалить все элементы.

Рекомендуемые статьи:

  • Как изменить версию PHP на сервере с Debian 10
  • PhpMyAdmin — как создать пользователя и базу данных
  • WordPress — как отключить управление сайтом через xmlrpc
  • Несколько причин медленной работы сайта на примере WordPress
  • WordPress - смена домена сайта при помощи wp-cli
  • Когда использовать index.php, а когда index.html
  • Дата и время в PHP
  • PHP. Различия между Fast-CGI, CGI, Mod-PHP, SuPHP, PHP-FPM
  • Простой пример кода на языке PHP
  • PHP. Проверка содержит ли строка определенное слово
  • Как предотвратить SQL инъекции в PHP
  • Как установить Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 18.04
  • Как настроить отображение ошибок в PHP
  • Несколько трюков и секретов PHP

Удалить из массива элемент (С++)

Алгоритм удаления элемента сводится к сдвигу на одну позицию влево всех элементов, расположенных правее удаляемого. Подробно алгоритм рассмтрен в теме «Алгоритм: удаление элемента массива«. Тут приведем лишь иллюстрацию: Для начала найдем позицию удаляемого числа — функция возвращает позицию или -1 если такого числа нет:

int first_negative_pos(int* numbers, int size) < for (int i = 0; i < size; ++i) < if (numbers[i] < 0) return i; >return -1; >

Алгоритм удаления с помощью сдвига можно описать на Си так:

void remove_nth(int* numbers, int& size, int pos) < if (size --size; >

В функции main получим позицию первого отрицательного элемента и если это положительное число — вызовем remove_nth :

int negativePos = first_negative_pos(numbers, size); if (negativePos < 0) < printf("no negative elements\n"); >else

С использованием STL

В стандартной библиотеке C++ есть вектора, имеющие метод erase , на вход которого подается итератор удаляемого элемента. Кроме того, в стандартной библиотеке есть алгоритм для поиска элемента по условию. В итоге с использованием векторов задачу можно решить так:

#include #include #include using namespace std; void print(const vector& vec) < for (auto value : vec) < cout cout int main() < vectorvec(); print(vec); auto negative_it = find_if(vec.begin(), vec.end(), [](int value) < return value < 0; >); vec.erase(negative_it); print(vec); >

Алгоритмы С++ можно применять и к массивам в стиле Си, однако выглядит это весьма куцо. Для поиска можно применить тот же find_if , при этом вместо итераторов можно передать адреса начала и конца массива. Удаление реализует алгоритм std::remove (работать будет также как наша функция сдвига). Этот алгоритм не удаляет элемент физически, а лишь сдвигает его в конец, поэтому несмотря на применение алгоритмов, мы должны сами позаботиться об изменении размера массива (в Си иначе и быть не может):

void remove_first_negative(int* arr, int& size) < auto negative_it = find_if(arr, arr+size, [](int value) < return value < 0; >); std::remove(negative_it, arr+size, *negative_it); --size; > int main() < int n = 8; int arr[n] = ; print_array(arr, n); remove_first_negative(arr, n); print_array(arr, n); >

В любом случае, если знать как устроены алгоритмы STL — то можно сократить объем кода и меньше работать. Несмотря на то, что алгоритмы работают с Си-контейнерами — лучше так не делать (порог вхождения у полученного кода будет весьма высоким). Узнать много полезного про STL можно в статье «Практика: алгоритмы и стандартная библиотека C++«.

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

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