Удалить элемент из массива, затем переместить другие элементы

0

Это мой первый вопрос, и я очень рад быть частью сообщества.

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

Скажем, у вас есть char array[] = {'A','B','C','D','E'}; Моя функция remove имеет этот прототип void remove(char arr[], int& size, int element, int count)

Если нужно написать, с объявленным размером, remove(array, size, 2, 2) затем напечатайте массив, чтобы напечатать ABE. Функция должна перейти к индексу 2, затем удалить два элемента, а затем переместить остальные.

Вот функция, которую я пытался реализовать:

void remove(char arr[], int& size, int element, int count) {
for (int i = element;  i < count; i++) {
    arr[element] = arr[element + 1];
}
size = size - count; }

Я мог бы написать эту функцию, чтобы она соответствовала конкретным тестовым случаям, но я не могу обобщить ее для работы на всех разных входах. Я довольно уверен, что size = size - count; правильна, поскольку она последовательно "удаляет" правильное количество элементов с конца, но я не уверен на 100%.

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

  • 0
    Просто вчера увидел по существу тот же вопрос: stackoverflow.com/q/26434416/103167
  • 0
    О, я новее; ничто в этом вопросе не кажется мне знакомым :)
Теги:
arrays

2 ответа

0
Лучший ответ

Вы можете использовать std::rotate следующим образом:

void remove(char arr[], int& size, int element, int count) {
  std::rotate(arr + element, arr + element + count, arr + size);
  size = size - count;
}

LIVE DEMO

Редактировать:

Добавление запрошенных чеков:

void remove(char arr[], int& size, int element, int count) {
  if(element < size) {
    if(count + element > size) count = size - element;
    std::rotate(arr + element, arr + element + count, arr + size);
    size = size - count;
  }
}
  • 0
    Большое спасибо! Это прекрасно работает, если счетчик находится в правильном диапазоне, но я сталкиваюсь с той же проблемой, о которой я упоминал ниже. Если count больше, чем size, он все равно должен иметь возможность хранить значения в массиве (для печати), если он начинается с индекса, отличного от 0. Поэтому я должен выяснить, как это сделать, чтобы эта часть реализовалась идеально.
  • 0
    Я использовал if / else для полной реализации. Это сработало, но мне нужно было включить алгоритм тоже. Еще раз спасибо.
0

Вам просто нужно несколько простых изменений, переместите элементы счетчика элементов вперед в текущее с помощью arr[element] = arr[element + count]; , Также измените цикл for, чтобы подсчитать до size - count.

  • 0
    Я попробовал это, и это работало для пары случаев, включая ABE, который я упомянул. Однако, если вводится число больше размера, оно стирает каждый элемент. Если char arr[] = {'a','b','c'}; и remove(arr, size, 2, 23); введен, массив все еще должен быть ab. Должен ли я поставить if / else там, чтобы предотвратить стирание целиком? Если так, то как бы это выглядело?
  • 0
    просто ограничить количество до размера - элемент в начале функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню