Удалить массив С из памяти
Полный текст задания: Даны два массива А и И одинакового размера 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++«.