2014-10-18 4 views
0

Это мой первый вопрос здесь, и я очень рад быть частью сообщества.Удалить элемент из массива, а затем переместить другие элементы поверх

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

Допустим, у вас есть char array[] = {'A','B','C','D','E'}; Моя функция имеет удалить этот прототип 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

вчера только что видел по существу один и тот же вопрос: http://stackoverflow.com/q/26434416/103167 –

+0

О, я новичок; ничего в этом вопросе мне не знакомо :) – RealTimeDouble

ответ

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

Edit:

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

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 больше размера, он все равно должен сохранять значения в массиве (для печати), если он начинается с индекса, отличного от 0. Поэтому мне нужно выяснить, как это сделать, чтобы эта часть отлично реализована. – RealTimeDouble

+0

Я использовал if/else, чтобы реализовать его отлично. Это сработало, но мне нужно было включить алгоритм. Еще раз спасибо. – RealTimeDouble

0

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

+0

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

+0

только кол-во кол-во в размер - элемент в начале функции. – user1937198

Смежные вопросы