it-swarm.com.de

Sauberste Methode zum Kopieren eines Arrays mit konstanter Größe in C++ 11

Oft möchte ich den Inhalt von Arrays kopieren, die eine konstante Größe haben. Normalerweise schreibe ich etwas in der Art von:

float a[4] = {0,1,2,3};
float b[4];

for(int i=0; i<4; i++){
    b[i]=a[i];
}

In letzter Zeit schreibe ich eine lineare Kalkülbibliothek für Bildungszwecke, und ich habe mich gefragt, ob es einen besseren Weg gibt, dies zu tun.

Das erste, was mir in den Sinn kam, war die Verwendung von memcpy:

memcpy(b, a, sizeof(float) * 4);

Dies scheint mir aber sehr c-like und fehleranfällig zu sein. Ich mag es, meine Fehler zur Kompilierzeit zu haben, und dies kann bei Datentypen mit nicht trivialen Kopierkonstruktoren hässlich werden oder wenn ich vergesse, mich mit sizeof (Datentyp) zu multiplizieren.

Da ich eine Mathematikbibliothek schreibe, die ich intensiv verwenden werde, ist Leistung für mich sehr wichtig. Sind die Compiler heute klug genug, um zu verstehen, dass das erste Beispiel nur einen Speicherplatz kopiert und optimiert, um so effizient wie die zweite Lösung zu sein?

Vielleicht gibt es eine Funktion in der Standardbibliothek, die mir helfen kann? Etwas Neues in C++ 11? Oder soll ich nur ein Makro oder eine Vorlagenfunktion erstellen?

37
bobbaluba

Wenn Sie std::array anstelle eines eingebauten Arrays verwenden (was Sie sollten), wird dies sehr einfach. Das Kopieren eines Arrays entspricht dann dem Kopieren eines anderen Objekts.

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
58

Der C++ 03-Weg wäre die Verwendung von std::copy() :

float a[4] = {0,1,2,3};
float b[4];

std::copy(a,a + 4, b);

Das ist ungefähr so ​​sauber wie es nur geht. Auf C++ 11 lieber

std::copy(std::begin(a), std::end(a), std::begin(b));

Oder noch besser, verwenden Sie std :: array und erhalten Sie die kostenlose Zuordnung:

std::array<float,4> a = {0,1,2,3};
auto b = a;
41
Mysticial

Wenn Sie sich für eine C++ 03-Lösung (und auch für C) interessieren, verwenden Sie immer struct, die ein Array enthält, und nicht nur ein Array:

struct s { float arr[5]; };

Strukturen sind standardmäßig kopierbar.

Das Äquivalent in C++ 11 ist bereits erwähnt: std::array<float,5>;

14
PiotrNycz
#include <algorithm>
std::copy_n(a, 4, b)
2
hjbabs

Die folgende Methode funktioniert für gewöhnliche Arrays sowie für std: array.

float a[4] = {0,1,2,3};
float b[4];

std::copy(std::begin(a), std::end(a), b);
0
Shital Shah