Löschen eines Arrays mit definierten Element(en) - Seite 4

 
Ja... Der Perfektion sind keine Grenzen gesetzt.
 

Ja... Monster der Programmierung...

Persönlich würde ich etwa das Gleiche schreiben wie @Dmitry Fedoseev, den verständlichsten und gleichzeitig effizientesten Code, bzw. die Geschwindigkeit wäre etwa gleich.

Ich denke, dass der Code von @Nikolai Semko eine ziemlich ernsthafte Perversion ist, aber ich denke, er sollte nützlich sein. Und ich denke, es ist richtig und gut, wenn jede Millisekunde wichtig ist.

 
Georgiy Merts:

Ja... Monster der Programmierung...

Persönlich würde ich ungefähr das Gleiche schreiben wie @Dmitry Fedoseev, den verständlichsten und gleichzeitig effizientesten Code, bzw. die Geschwindigkeit wäre ungefähr gleich.

Ich denke, dass der Code von @Nikolai Semko eine ziemlich ernste Perversion ist, aber ich denke, er sollte nützlich sein. Und ich denke, es ist richtig und gut, wenn jede Millisekunde wichtig ist.

Mir gefällt nicht, dass in beiden Fällen dasselbe Element mehrfach gezogen und fallen gelassen wird. Dies ist vergleichbar mit der Blasensortierung, die in den allermeisten Fällen am langsamsten ist. Einfacher, klarer und zuverlässiger ist es, es so zu machen, wie es in DMS gemacht wird: Elemente werden zum Löschen markiert (wobei gezählt wird, wie viele markiert sind), dann werden alle nicht markierten (einmal) in eine neue Kopie mit der verbleibenden Anzahl von Array-Elementen verschoben. Speichertechnisch wird dadurch nur Platz für das Flaggen-Array ("zum Löschen markiert") beansprucht, und die zweite, verkürzte Kopie des Arrays benötigt zusammen mit dem Original nicht mehr Speicher als für ein ArrayResize benötigt wird. Es ist auch möglich, die Markierung zu beschleunigen, wenn nicht ein einzelner Wert, sondern ein Array gelöscht wird, so dass man nicht immer alle Werte durchgehen muss. Legen Sie dazu ein Maximum und ein Minimum fest (bei Zeichenketten ist dies ebenfalls möglich) und lassen Sie Elemente, die kleiner als min oder größer als max sind, ohne Markierung aus.

 
Dmitry Fedoseev:

Du hast dich in letzter Zeit in eine Pfütze verrannt, genau wie in diesem Thread )

Wladimir Pastuschak:

zeigen Sie Ihre Realisierungsvariante

Marketeer hat bereits geschrieben, Variante, die ich denke, ist optimal, ich sehe nicht den Sinn in der Verdoppelung, außer dass die Größe des Zyklus herausnehmen
 
Dmitry Fedoseev:

Das ist schon besser:

Die beste Option, die Geschwindigkeitsmessungen sollten dies bestätigen.
 
TheXpert:

Du bist in letzter Zeit in eine Pfütze geraten, genau wie in diesem Thread).

Marketeer hat bereits eine Option geschrieben, die ich für optimal halte; ich sehe keinen Grund, sie zu duplizieren

Oh, du bist bei deiner Doktorarbeit durchgefallen...

 
Vladimir:

Mir gefällt nicht, dass in beiden Fällen dasselbe Element mehrfach gezogen und fallen gelassen wird.

In beiden Fällen wird jedes Element maximal einmal gezogen.
 
TheXpert:
Der eine hat 42 Produkte, der andere 6, der dritte 30. Ich habe Angst, mir vorzustellen, was für ein Arschloch mit solchen Fragen und Antworten in mir steckt.

Der "Experte" ist großartig! Er hat das Publikum erleuchtet, indem er die Reize von Market aufzeigte :-)) Ich bin vielleicht kein Experte, aber ich stimme Dmitry Fedoseyev persönlich nicht zu...

 
Denis Kirichenko:

Aber ich persönlich bin ganz anderer Meinung als Dmitri Fedoseyev...

nicht zu verhängen.

 
Es geht ausschließlich um die Aufgabe, um die es geht. Wert löschen und leer
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) );
}