Cancellare un array di elementi definiti

 

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?

 
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...

 

1. Riscrive l'array one[] nell'array work[] della stessa dimensione, rimuovendo gli elementi non necessari e spostando gli elementi richiesti al loro posto.

2. Riscrive l'array work[] nell'array two[] della nuova dimensione.

HH: Rimuovere la chiamata di funzione dall'operatore di loop(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;
  }
 

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.

 
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

 
Il modo più veloce sarebbe con ArrayCopy() e il loop through in ordine inverso, in modo da non spostare gli elementi che saranno cancellati.
 
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.

 
Uno ha 42 prodotti, uno ha 6, uno ha 30. Ho paura di immaginare che stronzo sia dentro con tutte quelle domande e risposte
 
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.

 
Grazie al cielo ne ho solo uno :) ... prodotto e un'opzione di soluzione.
Motivazione: