Cancellare un array di elementi definiti

Vladimir Pastushak  

C'è un array che contiene un insieme di dati di tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 è necessario rimuovere ad esempio i valori 3 e ottenere lo stesso array senza 3 e spazi vuoti nell'output...

Sto cercando il modo più veloce per cancellare un array di valori non necessari...

Mi viene in mente il seguente esempio

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;
  }

Forse c'è un modo più economico e veloce?

Maxim Kuznetsov  
Vladimir Pastushak:

C'è un array che contiene un insieme di dati di tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 è necessario rimuovere ad esempio i valori 3 e ottenere lo stesso array senza 3 e spazi vuoti nell'output...

Sto cercando il modo più veloce per cancellare un array di valori non necessari...

Mi viene in mente il seguente esempio

Forse c'è un modo più economico e veloce?

ArrayResize dovrebbe essere rimosso dai cicli, e (se lottando per ogni LONG, controllare le condizioni e il singolo Resize alla fine)

Ma è un po' tipico togliere tutto dai loop, cosa che si può fare dopo in blocco o non fare affatto...

Konstantin Nikitin  
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;
  }
Stanislav Korotky  

Ecco una variante come questa:

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));
}

Restituisce il numero di elementi nell'array filtrato. Può ridurre automaticamente le sue dimensioni se è dinamico.

Maxim Kuznetsov  
Stanislav Korotky:

Ecco una variante come questa:

Restituisce il numero di elementi nell'array filtrato. Può ridurre automaticamente le sue dimensioni se è dinamico.

Ancora un po' (qualche diametro di terra in più) e arriveremo alla funzionalità :-)

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

è tcl, è ancora più breve in lisp

Dmitry Fedoseev  
Il modo più veloce sarebbe con ArrayCopy() e il loop through in ordine inverso, in modo da non spostare gli elementi che saranno cancellati.
Vladimir Pastushak  
Dmitry Fedoseev:
Il modo più veloce sarebbe con ArrayCopy() e il loop through in ordine inverso, in modo da non spostare gli elementi che saranno cancellati.

non è adatto, poiché potrebbe esserci un array di strutture contenenti stringhe.

TheXpert  
Uno ha 42 prodotti, uno ha 6, uno ha 30. Ho paura di immaginare che stronzo sia dentro con tutte quelle domande e risposte
Vladimir Pastushak  
TheXpert:
Uno ha 42 prodotti, un altro ne ha 6, un altro 30. Ho paura di immaginare che stronzo c'è dentro con queste domande e risposte

Una domanda stupida è una domanda non fatta.

Ho diverse soluzioni al problema, ma continuo a cercare soluzioni migliori e a imparare dagli altri.

Motivazione: