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

 

Есть массив содержащий набор данных по типу 1,2,3,6,9,5,6,3,25,6,8,7,4 нужно удалить например значения 3 и на выходе получить тот же массив без 3 и пустых мест...

Я ищу самый быстрый способ очистки массива от ненужных значений...

На ум приходит такой пример

int ArrayDeleteEmpty(int &one[])
  {
   int two[];   int c=0;
   for(int i=0; i<ArraySize(one); i++)
      if(one[i]!=NULL && one[i]!="")
        {
         c++;
         if(ArrayResize(two,c,10000)>=0)
            two[c-1]=one[i];
        }
   for(int i=0; i<ArraySize(two); i++)
      if(ArrayResize(one,i+1,10000)>=0)
         one[i]=two[i];
   return c;
  }

Может есть способы экономнее и быстрее ?

 
Vladimir Pastushak:

Есть массив содержащий набор данных по типу 1,2,3,6,9,5,6,3,25,6,8,7,4 нужно удалить например значения 3 и на выходе получить тот же массив без 3 и пустых мест...

Я ищу самый быстрый способ очистки массива от ненужных значений...

На ум приходит такой пример

Может есть способы экономнее и быстрее ?

ArrayResize убрать из циклов, и (если бороться за каждый LONG то проверку условий и еденичный Resize сделать в конце)

но это как-бы типично - вынести из циклов всё, что можно сделать позже оптом или не делать вовсе..

 

1. Переписать массив one[] в массив work[] той же размерности, исключая лишние элементы и смещая нужные на их место. 

2. Переписать массив work[] в массив two[] новой размерности. 

ЗЫ: убрать обращение к функциям из оператора цикла (ArraySize). 
 
int ArrayDeleteEmpty(const int del, int &one[])
  {
   int i = ArrayBsearch(one, del),
       y = ArraySize(one)-1;
   
   if(one[i] != del)
     return 0;
   
   for(; i<y; i++)
      one[i] = one[i+1];
   ArrayResize(one, y);
   
   return y;
  }
 

Вот такой вариант:

template<typename T>
int arrayFilter(T &data[], const T value)
{
  int dst = 0, src = 0;
  for(; src < ArraySize(data); src++)
  {
    if(data[src] != value)
    {
      if(dst != src)
      {
        data[dst] = data[src];
      }
      dst++;
    }
  }
  
  if(dst < src)
  {
    ArrayResize(data, dst); // will only work with dynamic array
  }
  return dst;
}

void OnStart()
{
  long array[] = {1, 2, 3, 6, 9, 5, 6, 3, 25, 6, 8, 7, 4};
  ArrayPrint(array, 0, NULL, 0, arrayFilter<long>(array, 3));
}

Возвращает количество элементов в отфильтрованном массиве. Сможет автоматически уменьшить его размер, если он динамический.

 
Stanislav Korotky:

Вот такой вариант:

Возвращает количество элементов в отфильтрованном массиве. Сможет автоматически уменьшить его размер, если он динамический.

ещё немного(пару диаметров земли) и придём к функциональщине :-)

set target [ filter $source [ lambda x { expr $x !=3 } ] ]

это tcl, на лиспе ещё короче

 
Самый быстрый способ будет с ArrayCopy() и по циклу проходить в обратном порядке, чтобы не перемещать те элементы,которые будут удалены. 
 
Dmitry Fedoseev:
Самый быстрый способ будет с ArrayCopy() и по циклу проходить в обратном порядке, чтобы не перемещать те элементы,которые будут удалены. 

не подходит, так как может быть массив структур содержащий строки.

 
У одного 42 продукта, у другого 6 у третьего 30. Боюсь представить какая ж*па там внутри с такими вопросами и ответами
 
TheXpert:
У одного 42 продукта, у другого 6 у третьего 30. Боюсь представить какая ж*па там внутри с такими вопросами и ответами

Глупый вопрос, это не заданный вопрос.

У меня есть несколько вариантов решения задачи, но я продолжаю искать лучшие решения и учиться у других.

 
Слава богу, у меня только один :) ... продукт и один вариант решения.