Was sind die Auswirkungen der eine flache Kopie auf einem Array, um es, um die Größe der Durchführung?
-
10-07-2019 - |
Frage
Wenn mein Verständnis von tiefen und flachen Kopieren korrekt ist meine Frage ist ein unmöglicher. Wenn Sie einen Array haben (a [10]) und führen eine flache Kopie (b [20]) wäre dies nicht unmöglich sein, da die Daten in b nicht zusammenhängend sein würden?
Wenn ich habe diese völlig falsch bekam jemand einen schnellen Weg raten könnte zu imitieren (in c #) c ++ 's Fähigkeit, eine realloc zu tun, um ein Array zu ändern.
Hinweis
Im Blick auf die .Clone () und .Copy () Mitglieder des System.Array Objekt.
Lösung
Sie können eine bestehende Array nicht die Größe, jedoch können Sie verwenden:
Array.Resize(ref arr, newSize);
Diese ordnet ein neues Array, kopiert die Daten aus dem alten Array in das neue Array und aktualisiert die arr
Variable (die durch-ref in diesem Fall übergeben wird). Ist das, was Sie?
kann jedoch jedes andere Referenzen immer noch auf dem alten Array zeigt, werden nicht aktualisiert. Eine bessere Option könnte sein, mit List<T>
zu arbeiten - dann müssen Sie es nicht manuell, um die Größe, und Sie haben nicht das Problem der out-of-date Referenzen. Sie Add
nur / Remove
usw. Im Allgemeinen Sie keine Arrays sind in der Regel direkt oft sehr zu verwenden. Sie haben ihren Nutzen, aber sie sind nicht der Standardfall.
Re Ihre Kommentare;
- Boxen:
List<T>
nicht boxen. Das ist einer der Punkte, über Generika; unter der Haube, istList<T>
ein Wrapper umT[]
, so einList<int>
hat eineint[]
- keine Boxen. Der ältereArrayList
ist ein Wrapper umobject[]
, so dass hat Box; natürlich, Boxen ist nicht so schlecht, wie Sie trotzdem könnte man annehmen, . - Funktionsweise von
Array.Resize
;, wenn ich mich erinnere, findet es die Größe vondie tatsächlichen Angaben werden von einem internen Anruf versteckt - aber im Wesentlichen nach dem ein neuen Array Zuweisung ist es ein blit (memcpy) von die Daten zwischen den beiden Feldern, so sollte es ziemlich schnell sein; beachten Sie, dass für Referenz-Typen dies nur kopiert die Referenz, nicht das Objekt auf dem Heap. Wenn Sie jedoch sind die Größenänderung regelmäßig, würdeT
, dannBuffer.BlockCopy
verwendet den Inhalt blittenList<T>
in der Regel viel einfacher (und schneller, wenn Sie im Grunde neu zu implementieren, wasList<T>
freie Kapazitäten hat erneut die Anzahl der Größenänderungen zu minimieren).