2013-09-02 13 views
7

Ho una matrice che contiene una cronologia dei valori e quando aggiungo un nuovo valore, ho bisogno di spostare tutti i valori precedenti di una posizione a sinistra, di perdere il valore più vecchio e di fare spazio alla successiva.Il modo migliore per spostare un array in C?

Mi vengono in mente due modi per farlo, utilizzando memmove:

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

oppure scambiando i puntatori:

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

C'è una differenza di prestazioni tra i due metodi, e se no, quale sarebbe stato consigliato?

+1

Avete considerato di non utilizzare un array per questo o non è un'opzione? – nic

+1

@nic Ho bisogno di tenere traccia degli ultimi valori X, quindi non posso pensare a un modo più logico di memorizzarli tranne che per un array. – Muis

+0

Utilizzare una coda (è comunque possibile utilizzare una matrice per implementarla) ed evitare la copia della memoria. http://www.thelearningpoint.net/computer-science/data-structures-queues--with-c-program-source-code –

risposta

3

Entrambi hanno la stessa complessità temporale. Qualsiasi altra differenza nelle prestazioni sarebbe dovuta a circostanze specifiche, come la CPU, il compilatore, il modo in cui è implementato memmove e la dimensione dell'array, quindi è necessario misurare effettivamente le prestazioni in ogni modo e vedere cosa è meglio.

+1

Anche la lettura dell'output del gruppo può essere istruttiva. – chrylis

1

Non penso che un array sia il modo migliore per farlo, prova a utilizzare un elenco collegato e non avrai questo problema.

7

c'è un'opzione più veloce:

Un circular buffer in cui inserire, rimuovere e leggere sono tutti O (1).

0

È possibile utilizzare lo FIFO Queue implementato come elenco collegato o come matrice. Dalla tua descrizione, è la soluzione più semplice.

Problemi correlati