Cancellare un array di elementi definiti - pagina 4

 
Sì... Non ci sono limiti alla perfezione.
 

Già... Mostri della programmazione...

Personalmente scriverei circa lo stesso di @Dmitry Fedoseev, il codice più comprensibile e allo stesso tempo efficiente, rispettivamente, la velocità sarebbe circa la stessa.

Penso che il codice di @Nikolai Semko sia una perversione abbastanza seria, ma penso che dovrebbe essere utile. E penso che sia giusto e buono, se ogni millisecondo è importante.

 
Georgiy Merts:

Già... Mostri della programmazione...

Personalmente scriverei circa lo stesso di @Dmitry Fedoseev, il codice più comprensibile e allo stesso tempo efficiente, rispettivamente, la velocità sarebbe circa la stessa.

Penso che il codice di @Nikolai Semko sia una perversione abbastanza seria, ma penso che dovrebbe essere utile. E penso che sia giusto e buono, se ogni millisecondo è importante.

Non mi piace che in entrambi i casi ci sia un trascinamento multiplo dello stesso elemento. Sembra analogo all'ordinamento a bolle, che è il più lento nella maggior parte dei casi. È più semplice, più chiaro e più affidabile fare come si fa in DMS: gli elementi sono marcati per la cancellazione (mentre si conta quanti sono marcati), poi quelli non marcati (una volta) vengono spostati in una nuova copia con il numero rimanente di elementi dell'array. In termini di memoria, questo occuperà inoltre solo lo spazio per l'array delle bandiere ("segnato per la cancellazione"), e la seconda copia accorciata dell'array, insieme a quella originale, non richiederà più memoria di quella necessaria per un ArrayResize. È anche possibile accelerare il flagging se non è un singolo valore ad essere cancellato, ma un array, in modo da non dover sempre scorrere tutti i suoi valori. Per farlo, definisci un massimo e un minimo in esso (per le stringhe questo è anche possibile) e salta gli elementi più piccoli di min o più grandi di max senza segnare.

 
Dmitry Fedoseev:

Ti sei messo in una pozzanghera ultimamente, proprio come in questo thread )

Vladimir Pastushak:

mostra la tua variante di realizzazione

Marketeer ha già scritto variante, che penso sia ottimale, non vedo il senso nella duplicazione, tranne che la dimensione del ciclo prendere fuori
 
Dmitry Fedoseev:

Così va meglio:

L'opzione migliore, le misure di velocità dovrebbero confermarlo.
 
TheXpert:

Ultimamente sei finito in una pozzanghera, proprio come in questo thread).

Marketeer ha già scritto un'opzione che considero ottimale, non vedo il motivo di duplicarla

Oh, hai fallito la tua tesi di dottorato...

 
Vladimir:

Non mi piace il fatto che in entrambi i casi ci sia un trascinamento multiplo dello stesso elemento.

In entrambi i casi, ogni elemento viene trascinato al massimo una volta.
 
TheXpert:
Uno ha 42 prodotti, l'altro 6, il terzo 30. Ho paura di immaginare che stronzo c'è dentro con queste domande e risposte

L'"esperto" è grande! Ha illuminato il pubblico esponendo il fascino di Market :-)) Forse non sono un esperto, ma personalmente non sono d'accordo con Dmitry Fedoseyev...

 
Denis Kirichenko:

Ma personalmente, sono fortemente in disaccordo con Dmitri Fedoseyev...

non imporre.

 
Puramente sul compito da svolgere. Elimina il valore e svuota
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) );
}