Удаление элементов из массива STL

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

for (int i = 0; i < lim; i++) 
{ 
    if (arr[i] > sred) 
    { 
        for (j = i; j < lim; j++) 
        {
            arr[i] = arr[i + 1]; 
        } 
        --lim;
    } else { } 
} 
cout << endl; 
for (int i = 0; i < lim; i++) 
{ 
    cout << arr[i]<<" "; 
} 

lim - кол-во элементов массива, sred - число, элементы больше которого должны удаляться


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

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

Ладно, вот:

int i;
// А есть ли вообще такие элементы?
for(i = 0; i < lim; ++i) if (arr[i] > sred) break;
if (i < lim)  // Если таки есть...
{
    // i - индекс, КУДА писать (очередной)
    // j - ОТКУДА (очередной нормальный, меньше sred
    for(int j = i; ++j < lim; )
        if (arr[j] <= sred)
            arr[i++] = arr[j];
}
lim = i;

Пример полной программы: https://ideone.com/LBgRt4

Вот как примерно работает - i - индекс, куда мы пишем хороший элемент, а j - какой именно элемент пишем. Как только находим хороший - копируем его в конец хороших элементов и идем дальше.

Номер:    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14      i    j
Элемент:  1   2   3   4   5   6   7   8   2   3   4   5   6   7   0
Нашли первый: ... 3   4   5   6   7   8   2   3   4   5   6   7   0      5
for(int j = i; ++j < lim; ) if (arr[j] <= sred)                               8
arr[i++] = arr[j];    4   5   2   7   8   2   3   4   5   6   7   0      6
for(int j = i; ++j < lim; ) if (arr[j] <= sred)                               9
arr[i++] = arr[j];    4   5   2   3   8   2   3   4   5   6   7   0      7
for(int j = i; ++j < lim; ) if (arr[j] <= sred)                              10
arr[i++] = arr[j];    4   5   2   3   4   2   3   4   5   6   7   0      8
for(int j = i; ++j < lim; ) if (arr[j] <= sred)                              11
arr[i++] = arr[j];    4   5   2   3   4   5   3   4   5   6   7   0      9
for(int j = i; ++j < lim; ) if (arr[j] <= sred)  (12,13-плохие)              14
arr[i++] = arr[j];    4   5   2   3   4   5   0   4   5   6   7   0     10
Выход из цикла
В массиве - 10 чисел
→ Ссылка
Автор решения: Andrej Levkovitch

Раз уж у вас указан STL то посоветую использовать именно алгоритмы stl для улаления элементов из вектора. В частности использовать идиому remove-erase:

  auto last_iter =
      std::remove_if(arr.begin(), arr.end(), [](int val) { return val > 5; });
  arr.erase(last_iter, arr.end());

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

→ Ссылка