Beste Weg, um shift-array in C?

Ich habe ein array, hat eine Geschichte von Werten, und beim hinzufügen eines neuen Wertes, muss ich mit shift alle bisherigen Werte eine position nach Links, zu verlieren, der älteste Wert und machen Platz für die nächsten.

Ich denken kann, zwei Möglichkeiten, dies zu tun, durch die Verwendung von memmove:

memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));

Oder durch das vertauschen der Zeiger:

for (i = 0; i != sizeof(arr) - 1; i++) {
   *(arr + i) = *(arr + i + 1);
}

Gibt es einen performance-Unterschied zwischen den beiden Methoden, und wenn nicht, welches wäre ratsam?

  • Haben Sie in Betracht gezogen, nicht mit einem array oder ist das nicht eine option?
  • Ich brauche zu verfolgen, die letzten X-Werte, so kann ich nicht denken, mehr logische Weg, um Sie zu speichern, außer für ein array.
  • Benutzen Sie eine Warteschlange (Sie können weiterhin verwenden Sie ein array, um es zu implementieren), und vermeiden Sie den Speicher kopieren. thelearningpoint.net/computer-science/...
  • Warum nicht verwenden ein double-ended-Liste? So erhalten Sie in O(X) Komplexität, der Zugriff auf Ihren X-Elemente, aber das einfügen von Elementen wird durch viel schneller. Was am besten funktioniert, am Ende hängt Sie die Anwendung. Fügen Sie viel oder haben Sie Zugriff auf eine Menge?
  • Oder verwenden Sie einen kreisförmigen Puffer (halten Sie die int head index und alle Zugriffe % arraySize).
  • Vielen Dank.
  • Seine für ein digitales filter. Jedesmal, wenn ich einen neuen Punkt hinzuzufügen, ich brauche zu berechnen, die Summe aller vorherigen Punkte, so dass die Menge der Zugriffe vs fügt gleich ist.
  • Ihr willkommen.
  • Die zweite von den Methoden sollte i != sizeof(arr)/sizeof(*arr) - 1 als seine stoppen Zustand. Ich würde auch einfache Indizierung von Arrays in der Schleife arr[i] = arr[i + 1]. Selbst mit diesen änderungen, ich würde immer noch lieber die memmove Lösung, aber es gibt einige attraktive alternativen die Antworten.

InformationsquelleAutor Muis | 2013-09-02
Schreibe einen Kommentar