Удалить N элементов, начиная с номера K, где N и K вводятся с клавиатуры

#include <iostream>
#include <cmath>
#include <windows.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
 
 
int main(){
 
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
srand(time(NULL));
 
 
int size;
cout << "Enter size of array: ";
cin >> size;
 
int n;
int k;
cout << "Enter n: ";
cin >> n;
cout << "Enter k: ";
cin >> k;
 
 
 
 
int *arr = new int[size];
 
 for(int i = 0; i < size; i++){
        arr[i] = rand() % 100;
        cout << arr[i] << " ";
 
 }
 cout << endl;
 
 
for (int k; k < size; k++)
{
 
       if (n > 0){
              n - 1;
              delete arr[k];
       }
       
}
 
 for(int i = 0; i < size; i++){
        
        cout << arr[i] << " ";
 
 }
 cout << endl;
 
 
 system("pause");
 return 0;
}



Ответы (1 шт):

Автор решения: AlexGlebe

Удаление элементов в массиве производится не с помощью команды delete[], а переписыванием данных с одного места на другое. Сначала до индекса K оставить всё в покое, а потом прописывать без удалённых N элементов

arr[0]        = arr[0]
..
arr[k-1]      = arr[k-1]
arr[k]        = arr[k+n]
..
arr[size-1-n] = arr[size-1]
arr[size-n]   = XXX
...

Дальше надо не забывать уменьшить переменную size, так как вы удалили эти элементы. Только в конце программы уже можно один раз освободить выделенную память у системы с помощью delete[].

В своей попытке вы заново определили переменную k, for (int k; k < size; k++) и она объявляется новой и скрывает начальную переменную. Повторное определение обычно всегда приводит к логическим ошибкам.

Вот так происходит перемещение данных :

for ( int j = k ; j < size-n; ++j )
   arr [j] = arr [j+n];
size -= n ;
→ Ссылка