Перейти к содержимому

Как удалить элемент из динамического массива c

  • автор:

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

Армянское Радио @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; >

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

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