C++ Динамический массив. Удаление элемента
P.S.
То, что ты написал — это не С++, а просто С.
#3
16:05, 28 янв 2008
Почему нет? Можно удалить элемент, потом вручную сдвинуть все элементы с удаленной позиции на единицу. Примерно это же и будет делать std::vector, но удалять из середины массива (вектора) есть вселенское зло.
#4
16:18, 28 янв 2008
mirat
> Почему нет?
Потому, что исходный вопрос автора был «можно мне как-нибудь так хитро вызвать delete, чтобы массив сам сделал всё как надо ?»
И с этой позиции вариант
> Можно удалить элемент, потом вручную сдвинуть все элементы с удаленной позиции на единицу.
не катит.
Вот вектор — да, целостная сущность, обладающая нужным функционалом.
#5
16:30, 28 янв 2008
по поводу
стоимость операции удаления буде линейно зависить от кол-ва элементов?
#6
16:59, 28 янв 2008
HolyDel
Из середины да, из конца — константное время.
Nikopol
Не телепат, не знаю, что автор имел в виду 🙂
#7
17:03, 28 янв 2008
Все понятно. Всем спасибо
#8
17:17, 28 янв 2008
если удалять, то уж лучше std::list использовать.
#9
17:33, 28 янв 2008
замечу только что если порядок элементов в массиве не важен то делать своп с последним элементом + pop_back => константное время удаления
- TaurenChief
- Постоялец
#10
17:42, 28 янв 2008
#11
17:52, 28 янв 2008
#12
18:24, 28 янв 2008
JokerR
>замечу только что если порядок элементов в массиве не важен то делать своп с последним элементом + pop_back => константное время удаления
Но размер вектора не уменьшится (резервированный в памяти)
#13
19:18, 28 янв 2008
О. Федор
А что должен? Он у вектора не уменьшится в любом случае, кроме хака со swap’ом
#14
19:21, 28 янв 2008
вообще-то это implementation-depended
C++ удаления элементов с динамического массива
В деструкторе класса Array я хочу сделать сначала итерацию по всем элементам массива и для каждого отдельно вызвать delete , так как все они были созданы с помощью оператора new , а только после этого вызвать delete[] arr . Но такая конструкция не работает:
for(int i = 0; i
Ошибка: отсутствует оператор *, соответствующий этим операндам.
Вопрос: Как реализовать удаления указателей из динамического массива?
Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
задан 26 июл 2018 в 13:39
2,904 20 20 серебряных знаков 44 44 бронзовых знака
delete arr[i]; ?
26 июл 2018 в 13:42
delete arr[i]; нужно
26 июл 2018 в 13:43
@gil9red arr[i] — не указатель, какой уж тут delete .
26 июл 2018 в 13:49
delete arr[i] не работает. там друга ошибка.
26 июл 2018 в 13:53
Ничего не понятно. «В деструкторе класса Array я хочу сделать сначала итерацию по всем элементам массива. «. Какого массива. Класс Array не имеет никакого отношения к массиву arr , ничего о нем не знает и, разумеется, никак не может итерировать по его элементам в своем деструкторе. (Не говоря уже о том, что ни о каком delete для элементов arr речи быть не может).Так о каком массиве идет речь?
26 июл 2018 в 14:23
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
arr[0] = *arr0; arr[1] = *arr1;
вы скопировали (присвоением) объекты. При удалении массива для этих копий деструкторы будут вызваны автоматически. А чтоб удалить исходные объекты —
delete arr0; delete arr1;
к вашим услугам.
Вот если бы вы делали
Array ** arr = new Array*[2]; Array* arr0 = new Array(); Array* arr1 = new Array(); arr[0] = arr0; arr[1] = arr1;
тогда дело другое, тогда перед удалением массива надо было бы выполнить
delete a[0]; delete a[1];
Отслеживать
ответ дан 26 июл 2018 в 13:43
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
Я понял, спасибо. Получается, если бы я хотел, чтобы оно работало, как я написал, то надо перегрузить оператор = ? Я просто не хотел, отдельно писать delete для каждого созданного объекта. Думал, может это можно сделать как-то в цикле.
26 июл 2018 в 13:52
Ну тогда, как я написал в «Вот если бы» — делайте массив не объектов, а указателей. И переписывать оператор присвоения нужно только если поверхностное копирование (которое по умолчанию) не годится. Ну не получится переписать так, чтоб ваш исходный код заработал — потому что вы храните объекты. Даже если напишете перемещение — все равно удалять выделенную память придется. Извращение типа хранить в скопированном объекте адрес исходного и при удалении удалять и его — не рассматриваю 🙂
26 июл 2018 в 13:56
Вроде как понял, но не точно, но основную ошибку точно понял)) еще раз спасибо. Сделал через массив указателей, так работает.
26 июл 2018 в 14:06
получается, когда я делаю arr[0] = *arr1 , то происходит копирование, а значит объект который уже будет лежать в массиве под индексом arr[0] фактически будет находиться не в хипе, а в стеке и по этому вызов delete для него не работает?
26 июл 2018 в 14:10
Он будет находиться в хипе — но в том месте, которое выделено не Array* arr0 = new Array(); , а Array *arr = new Array[2]; Когда вы будете удалять delete[]arr , будут вызваны деструкторы для всех элементов массива, так что отдельно удалять ничего не нужно.
Как удалить элемент массива?
Доброго времени суток! Задача следующая:
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить элемент с номером К.
4) Добавить после каждого четного элемента массива элемент со значением 0.
5) Распечатать полученный массив.
Первые два пункта получилось сделать,но я не могу понять,как сделать 3 и 4 пункты. Векторы еще не изучал,так что,если не составит труда,объясните пожалуйста человеческим языком,какой алгоритм нужен для решения задач подобного рода.Спасибо)
- Вопрос задан более трёх лет назад
- 51900 просмотров
Комментировать
Решения вопроса 1

Армянское Радио @gbg Куратор тега C++
Любые ответы на любые вопросы
Третий пункт решается просто — вам нужно передвинуть элементы в массиве: присвоить a[i]=a[i+1] в цикле.
Я думаю, вам запрещено использовать STL, так что пишите циклы.
Формат данного сайта запрещает совмещать кучу вопросов в один, так что постарайтесь разделить темы.
Функция, удаляющая элемент одномерного массива
Написать фрагмент программы, удаляющий i -й элемент из массива целых чисел размера N , i
Результат работы программы показан ниже.
CppStudio.com
Укажите количество элементов массива: 15 83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 Укажите номер элемента массива, который необходимо удалить: 3 83 86 15 93 35 86 92 49 21 62 27 90 59 63
#include using namespace std; #include bool iDel(int *array, int &lenAr, int nom); int main() < int length_array; cout > length_array; int *arrayPtr = new int [length_array]; // одномерный динамический массив // заполняем одномерный массив случайными числами for (int counter = 0; counter < length_array; counter++) < arrayPtr[counter] = rand() % 100; // генерируем случайные числа cout cout > n; iDel(arrayPtr, length_array, n); for (int counter = 0; counter < length_array; counter++) < cout cout bool iDel(int *array, int &lenAr, int nom) < if ( nom >lenAr || nom < 1) < cout for(int ix = nom - 1; ix < lenAr - 1; ix++) < array[ix] = array[ix + 1]; >lenAr--; return true; >