C elfkbnm ktvtyn vfccbdf

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

Решение

Если вы хотите удалить первое вхождение, только вы можете сделать что-то подобное. Я не проверял код, но он должен быть в порядке.

Вы также можете написать функцию, которая удаляет все вхождения значения или, если @ shawn1874 предлагает удалить элемент с указанным индексом.

Другие решения

Функция add приводит к утечке памяти, потому что вы не освободили динамический массив перед назначением его новому блоку памяти. Вы также должны предоставить деструктор. Используйте delete [] вместо delete, поскольку вы выделяете массив. Условие внутри удаления не является правильным. Я думаю, что x указывает на элемент, который нужно удалить, но вы ищете элемент со значением == x. Я бы подумал, что сначала вы подтвердите, что x является допустимым индексом (меньше текущего размера), а затем используете x для циклического перехода от этого элемента к концу, копируя все элементы вперед. Затем инициализируйте ноль между currentSize и max size. Это был бы один из способов сделать это. Это похоже на домашнюю работу, поэтому я приведу только руководство, а не код. Попытайся. Исходя из того, что вы написали до сих пор, я думаю, что вы можете понять это.

Обновление: это правда, что если вы добавите деструктор, то обработка обработки копирования и присвоения (как-то) имеет решающее значение.

Третий пункт решается просто — вам нужно передвинуть элементы в массиве: присвоить a[i]=a[i+1] в цикле.
Я думаю, вам запрещено использовать STL, так что пишите циклы.

Формат данного сайта запрещает совмещать кучу вопросов в один, так что постарайтесь разделить темы.

3) Удалить элемент с номером К.

В массивы C/C++ нельзя ничего добавлять и из них нельзя ничего удалять, массивы C/C++ статические.
Можно только создавать новые массивы, "похожие" на своих предшественников, где будет элементов больше или меньше . и каждый раз — копирование всех нужных элементов.

Добавлю:
— по п.п.4-5 — наслаждайтесь (случайные числа я генерить не стал — так нагляднее):

— а чтобы вою было меньше . исполняем:

— кстати, тот же трюк (без всяких malloc()) можете проделать и в современном C 😉

Нужно удалить чётные элементы из массива. Как сделать так, чтобы элемент удалялся, а не просто вместо него был 0.

5 ответов 5

Выберите, какой из способов вам больше подходит.

В любом случае переменная n содержит количество нужных элементов в массиве.

Сначала замечание относительно вашего кода. В данном цикле

если значение текущего элемента четное, то вы в этот элемент записывается неопределенное значение следующего по порядку элемента, так как следующий элемент еще не был инициализирован. Поэтому в результате массив будет содержать некоторые произвольные случайные значения.

Это плохой стиль программирования, когда в один цикл пытаются "впихнуть" решение нескольких задач одновременно. Во-первых, такой код не является повторно используемым, так как в каждом отдельном случае не все задачи, которые решаются в первоначальном цикле, потребуются в последующем.

Во-вторых, такой код осложняет его понимание, так как логика программы, когда все смешано в одной "куче", не всегда является интуитивно понятной.

В-третьих, такой код обычно ведет к появлению ошибок и сложностям в его отладке.

Поэтому всегда желательно разбивать программу на простые последовательные шаги, которые понятны читающему ваш код и не требуют больших затрат времени, чтобы их исследовать.

Относительно вашей программы это означает, что

  1. программа должна сначала инициализировать массив;
  2. программа должна вывести инициализированный массив на консоль;
  3. программа должна "удалить" четные элементы из массива;
  4. вывести на консоль ту часть массива, которая содержит актуальные элементы после удаления из массива элементов с четными значениями.

К тому же непонятно, почему выделяется массив из 100 элементов, а в цикле используется значение для обработки 10 элементов.

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

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

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

Вывод программы на консоль может выглядеть следующим образом

В этой программе используется массив из 20 элементов (вы можете использовать любое число в пределах разумного для размера массива). После "удаления" элементов с четными значениями, в программе сохраняется число актуальных элементов в массиве в переменной n .

Вот та же самая программа, но без использования стандартных алгоритмов.

Если вы действительно хотите удалить четные элементы из массива, то массив придется распределять динамически. Затем следует подсчитать число нечетных элементов в исходном массиве. Распределить динамически массив с числом элементов, равных числу нечетных элементов в массиве, и переписать их в новый массив. В этом случае программа может выглядеть следующим образом

Ее вывод на консоль, к примеру, будет

Та же самая программа без использования стандартных алгоритмов может иметь следующий вид

Когда имеет место динамическое выделение памяти для массивов, то в этом случае лучше иметь дело со стандартным классом std::vactor , который сам будет следить за правильным перераспределением памяти. Программа для вектора может выглядеть как

Оцените статью
Много толка
Добавить комментарий