Das Kopieren von structs
-
Hallo,
ich will nicht nerven, aber ich habe weiterhin ein Problem mit der copy()-Funktion. Zwar lassen sich mit ihr einwandfrei strings kopieren jedoch keine structs. Taugt die die copy()-Funktion überhaupt für structs oder muss ich mich da anderer Algorithmen bedienen (wüsste aber nicht welche…)?
-
Um ordentlich kopiert werden zu können, benötigt ein Typ einen operator= (den mußt du nur selber schreiben, wenn der Default-Operator nicht richtig arbeitet (betrifft vor allem Pointer-Elemente) oder nicht erzeugt werden kann (bei const Elementen oder Referenzen).
-
Hallo,
der copy Algorithmus ist NICHT für's Kopieren von einzelnen Strukturen oder Klassen gedacht. Hm, ist glaub das erste mal, das einer mit der Idee kommt^^

Für's Überladen des =op siehe auch:
http://tutorial.schornboeck.net/operatoren_ueberladung.htm
http://tutorial.schornboeck.net/bigthree.htmMfG
GPC
-
GPC schrieb:
der copy Algorithmus ist NICHT für's Kopieren von Strukturen oder Klassen gedacht. Hm, ist glaub das erste mal, das einer mit der Idee kommt^^

Wo steht den so was? Natürlich lassen sich Strukturen oder Klassen mit copy kopieren, bzw. Array von Klassen oder Container von Klassen.
So zum Beispiel:
#include <algorithm> #include <iostream> struct A { int a; int b; }; int main() { A aa[10]; for (int i = 0; i < 10; ++i) { aa[i].a = i + i; aa[i].b = i * i; } A bb[10]; std::copy(aa, aa + 19, bb); for (int i = 0; i < 10; ++i) { std::cout << bb[i].a << '\t' << bb[i].b << '\n'; } return 0; }
-
Nu seid doch nicht so spitzfindig

@tntnet: Du kopierst keine Struktur oder Klasse, sondern ein Array von Strukturen. Was GPC andeuten wollte ist dass copy für Container von X gedacht ist. Eine einzelne Struktur kann ich mit copy jedenfalls nicht kopieren

-
@tntnet
ähem, das ist mir schon klar, aber wenn es dich beruhigt: ich meinte eine einzelne Struktur wird über den =op kopiert und nicht über den copy Algo.
-
tntnet schrieb:
A aa[10]; // ... std::copy(aa, aa + 19, bb);Machts Spaß in fremdem Speicher umzustochern?
LordJaxom: Eine einzelne Struktur kann ich kopieren, indem der zweite Parameter einen Iteratorschritt hinter dem ersten Parameter ist, also
std::copy(aa, aa + 1, bb);
-
Michael E. schrieb:
LordJaxom: Eine einzelne Struktur kann ich kopieren, indem der zweite Parameter einen Iteratorschritt hinter dem ersten Parameter ist, also
std::copy(aa, aa + 1, bb);Ja, wenn du unbedingt mit Kanonen auf Spatzen schißen willst, hält dich niemand auf (ich würde ja noch eine temporäre Variable verwenden, in der ich den Wert zwischenlagere
)Aber copy() ruft intern auch nur op= für jedes Element der kopierten Sequenz auf, also kommst du bestimmt nicht darum herum, den Zuweisungsoperator zu implementieren.
(außer natürlich der vorgegebene op= macht tatsächlich das, was du benötigst)
-
...und wenn ich garkein Array habe darf ich auch noch rumadressieren (davon ab dass wie CStoll schon sagte die Voraussetzungen, nämlich der op=, gleich bleiben)
std::copy(&aa, &aa + 1, &bb);Das meinte ich übrigens mit spitzfindig

-
Ich hab nur hierauf Stellung bezogen:
Eine einzelne Struktur kann ich mit copy jedenfalls nicht kopieren
Is mir klar, dass das einen operator= voraussetzt. Sag ich ja auch nix dagegen. Meinen Code würd ich so auch nicht schreiben, es geht darum, dass copy allgemeingültig ist und nicht ersetzt werden muss, wenn ein Array mal nur aus einem Element besteht (und man das unter Umständen nicht zur Kompilierzeit weiß).