2 Stimmen

Einfügen in die Mitte eines Arrays

Ich habe ein Array int *playerNum in der die Liste aller Nummern der Spieler der Mannschaft gespeichert wird. Jeder Steckplatz z.B. playerNum[1]; eine Position in der Mannschaft darstellt, wenn ich einen neuen Spieler für eine neue Position in der Mannschaft hinzufügen möchte. Das heißt, ein neues Element in das Array irgendwo in der Nähe der Mitte einfügen, wie würde ich gehen über dies zu tun?

Im Moment dachte ich, dass Sie memcpy bis zu der Position, an der Sie den Player in ein neues Array einfügen möchten, und fügen Sie dann den neuen Player ein und kopieren Sie den Rest des Arrays rüber?

(Ich muss ein Array verwenden)

3voto

Mat Punkte 195740

Wenn Sie haben ein Array zu verwenden, nachdem Sie sich vergewissert haben, dass Sie genügend Speicherplatz haben (mit realloc falls erforderlich), verwenden Sie memmove um die Elemente von der Einfügemarke bis zum Ende um eine Position zu verschieben, und speichern Sie den neuen Player an der gewünschten Stelle.

Sie können nicht verwenden memcpy wenn sich der Quell- und der Zielbereich überschneiden.

Dies wird fehlschlagen, sobald die Objekte in Ihrem Array nicht-triviale Kopier-Konstruktoren haben, und es ist nicht idiomatisch C++. Die Verwendung einer der Containerklassen ist viel sicherer ( std::vector o std::list zum Beispiel).

3voto

templatetypedef Punkte 343693

Wenn Sie C++ verwenden, würde ich vorschlagen, nicht mit memcpy o memmove sondern verwenden stattdessen die copy o copy_backward Algorithmen. Diese funktionieren mit jedem Datentyp, nicht nur mit normalen Ganzzahlen, und die meisten Implementierungen sind so optimiert, dass sie sich zu memmove sowieso. Noch wichtiger ist, dass sie auch dann funktionieren, wenn Sie den zugrunde liegenden Typ der Elemente im Array so ändern, dass ein eigener Kopierkonstruktor oder Zuweisungsoperator erforderlich ist.

1voto

log0 Punkte 10190

Ihre Lösung mit memcpy korrekt ist (unter einigen von anderen erwähnten Annahmen).

Da Sie jedoch in C++ programmieren. Es ist wahrscheinlich eine bessere Wahl zu verwenden std::vector und seine insert Methode.

  vector<int> myvector (3,100);
  myvector.insert ( 10 , 42 );

1voto

marcio Punkte 416

Den Schwanz verlieren:

#include <stdio.h>
#define s 10
int L[s];

void insert(int v, int p, int *a)
{
    memmove(a+p+1,a+p,(s-p+1)*4);
    *(a+p) = v;
}

int main()
{
    for(int i=0;i<s;i++) L[i] = i;

    insert(11,6, L);    

    for(int i=0;i<s;i++) printf("%d %d\n", L[i], &L[i]);

    return 0;
}

0voto

The Unknown Punkte 146

Ein Array benötigt einen zusammenhängenden Speicherblock, es gibt keine Funktion, mit der Sie ein Element in der Mitte einfügen können. Sie können ein neues Array erstellen, das um eins größer ist als das ursprüngliche Array, und dann das ursprüngliche Array in das neue Array plus das neue Element kopieren.

for(int i=0;i<arSize/2;i++)
{
    newarray[i]<-ar[i];
}
newarray[i+1]<-newelemant;
for(int j=i+1<newSize;j++,i++)
{
    newarray[i]<-ar[i];
}  

Wenn Sie STL verwenden, wird alles einfacher, verwenden Sie Liste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X