Очистка массива от заданного (ых) элементов - страница 4

 
Да... Нет пределов совершенству.
 

Мдя... МонстЕры от программирования...

Лично я бы написал примерно тоже самое, что @Dmitry Fedoseev, наиболее понятный, и в тоже время эффективный код, соответственно, и скорость была бы примерно такая же.

Код от @Nikolai Semko считаю довольно серьезным извратом, но, извратом нужным. И когда дорога каждая милисекунда - правильным и годным.  

 
Georgiy Merts:

Мдя... МонстЕры от программирования...

Лично я бы написал примерно тоже самое, что @Dmitry Fedoseev, наиболее понятный, и в тоже время эффективный код, соответственно, и скорость была бы примерно такая же.

Код от @Nikolai Semko считаю довольно серьезным извратом, но, извратом нужным. И когда дорога каждая милисекунда - правильным и годным.  

Мне не нравится, что в обоих этих случаях есть многократное перетаскивание одного и того же элемента. Это вызывает ощущение аналогии с сортировкой методом всплывающих пузырьков - самым медленным в подавляющем большинстве случаев. Проще, понятнее и надежнее поступить так, как делается в СУДБ: элементы помечаются на удаление (при этом подсчитываем, сколько помечено), затем все непомеченные (один раз) переносятся в новую копию с оставшимся числом элементов массива. С точки зрения памяти это отнимет дополнительно лишь место под массив флагов ("помечен к удалению"), а вторая, сокращенная копия массива, вместе с исходной потребует не больше памяти, чем необходимо для одного ArrayResize. Можно ускорить и пометку, если удаляется не одно значение, а массив, чтобы не всегда пробегать по всем его значениям. Для этого определить в нем максимум и минимум (для строк это тоже возможно) и пропускать без пометки элементы, меньшие min или большие max.

 
Dmitry Fedoseev:

в лужу садишься в последнее время ты периодически, как и в этой теме )

Vladimir Pastushak:

покажите Ваш вариант реализации

marketeer уже написал вариант который я считаю оптимальным, смысла в дублировании не вижу, разве что размер за цикл вынести
 
Dmitry Fedoseev:

Вот так лучше:

Самый лучший вариант, замеры скорости должны подтвердить это. 
 
TheXpert:

в лужу садишься в последнее время ты периодически, как и в этой теме )

marketeer уже написал вариант который я считаю оптимальным, смысла в дублировании не вижу

Ну прям о-ся, завалил докторскую...

 
Vladimir:

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

В обоих случаях каждый элемент перетаскивается максимум один раз.
 
TheXpert:
У одного 42 продукта, у другого 6 у третьего 30. Боюсь представить какая ж*па там внутри с такими вопросами и ответами

"Эксперт" красава! Зажёг публику, обнажив прелести Маркета :-)) Пусть я не эксперт, но лично насчёт Дмитрия Федосеева категорически не согласен...

 
Denis Kirichenko:

но лично насчёт Дмитрия Федосеева категорически не согласен...

не навязываю.

 
Ну чисто по поставленной задаче. Удалить значение и пустые
template<typename T>
int arrayFilter(T &data[], const T value)
{
     int s, d = s = ArraySize(data);
     
     for(int i=d-1; i>=0; i--)
          if(data[i] == value || data[i] == NULL)
          {
               s--;
               for(int j=i; j<s; j++)
                    data[j]=data[j+1];
          }
  
     if(d > s)
          ArrayResize(data, s);
     
     return s;
}

void OnStart()
{
     long array[] = {1, 2, 3, 6, 9, 5, 6, 3, 25, ,, 6, 8, NULL, 7, NULL, 4};
     Print( arrayFilter<long>(array, 3) );
}
Причина обращения: