Frage zu struct
-
#include <string> #include <vector> struct Daten { std::string vorname; std::string nachname; std::string ort; }; int main() { std::vector<Daten> VecDaten; Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"}; VecDaten.push_back(d); }Und wenn 'nen halbwegs aktuellen und vernünftigen Compiler hast, kannste auch
#include <string> #include <utility> #include <vector> struct Daten { std::string vorname; std::string nachname; std::string ort; }; int main() { std::vector<Daten> VecDaten; Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"}; VecDaten.push_back(std::move(d)); }schreiben. Das std::move kannst du verwenden, um zu sagen "Der Wert dieser Variable interessiert mich nicht mehr", was u.U. die eine oder andere Operation beschleunigt. In diesem Fall müssten die Strings nicht in den Vektor kopiert werden. Sie müssten nur "umziehen". Nach so einer Aktion solltest du nicht erwarten, dass d unverändert bleibt. Allerdings ist der Microsoft-Compiler noch nicht soweit, dass er es in diesem Fall wirklich gebacken bekommt.
Edit: Oops... Es hat sich wohl schon erledigt, mit dem Füllen des Vektors...
-
krümelkacker schrieb:
Und wenn 'nen halbwegs aktuellen und vernünftigen Compiler hast, kannste auch
#include <string> #include <utility> #include <vector> struct Daten { std::string vorname; std::string nachname; std::string ort; }; int main() { std::vector<Daten> VecDaten; Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"}; VecDaten.push_back(std::move(d)); }Wenn man einen halbwegs aktuellen und vernünftigen Compiler hat, schafft man die
main()in einer sauberen Zeile:int main() { std::vector<Daten> VecDaten{{"Pipi", "Langstrumpf", "Tackatuckaland"}}; }
Edit: Ich seh schon, macht nicht dasselbe wie deins, hier muss schließlich kopiert werden... initializer_list kann keine RValue-Referenzen aufnehmen.
-
DER HAMMER

Sone schrieb:
krümelkacker schrieb:
Und wenn 'nen halbwegs aktuellen und vernünftigen Compiler hast, kannste auch
#include <string> #include <utility> #include <vector> struct Daten { std::string vorname; std::string nachname; std::string ort; }; int main() { std::vector<Daten> VecDaten; Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"}; VecDaten.push_back(std::move(d)); }Wenn man einen halbwegs aktuellen und vernünftigen Compiler hat, schafft man die
main()in einer sauberen Zeile:int main() { std::vector<Daten> VecDaten{{"Pipi", "Langstrumpf", "Tackatuckaland"}}; }
Edit: Ich seh schon, macht nicht dasselbe wie deins, hier muss schließlich kopiert werden... initializer_list kann keine RValue-Referenzen aufnehmen.
-
Allerdings geht dasselbe trotzdem kürzer, weil vector laut Standard eine push_back-Überladung mit RValue-Referenz anbieten muss (siehe N3337, 23.3.6.5, Deklarationen):
std::vector<Daten> VecDaten; VecDaten.push_back({"Heiko", "Blonder", "Sachsen"});
-
Ja, das dass geht weiss ich aber ich dachte halt es könnte auch anders gehen.

cout<<datenVec[0].vorname; // Gibt vorname aus cout<<datenVec[0].nachname; // Gibt nachname aus cout<<datenVec[0].ort; // Gibt ort ausDas mit dem std::move teste ich nachher mal ich hab hier gerade nur so einen veralteten Compiler. Wird Zeit mal was neueres.^^
Btw. kann die aktuelle MS Visual Studio Express Version schon C++11?
-
s_str schrieb:
Btw. kann die aktuelle MS Visual Studio Express Version schon C++11?
Jup, ich denke schon. Zwar nicht sehr gut (afair noch nichtmal variadic templates), aber für Details musste warten bis jemand der damit arbeitet mehr rausrückt.
-
Noch eine Frage:
Kann man das so erklären das der Compiler hier selber einen Konstruktor in die Struktur baut?
Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"};
#include <utility> #include <vector> struct Daten { std::string vorname; std::string nachname; std::string ort; }; int main() { std::vector<Daten> VecDaten; Daten d = {"Pipi", "Langstrumpf", "Tackatuckaland"}; VecDaten.push_back(std::move(d)); }
-
s_tr schrieb:
Kann man das so erklären das der Compiler hier selber einen Konstruktor in die Struktur baut?
Ja, genau so kann man das erklären. Wenn man ganz akribisch ist, wird man noch hinzufügen, dass das nur geschieht wenn kein anderer, user-definierter Ctor existiert.
Aber bei solchen PODs wie
Datengelten einige Member als implizit definiert:Daten(Daten const&) Daten(Daten&& ) Daten() ~Daten() Daten& operator=(Daten const&) Daten& operator=(Daten&&)
-
Deine Art von Initialisierung ist allerdings in 12.6.1, Klausel 2/3 definiert. Es ist eine spezielle Art von Initialisierung: Man initialisiert hierbei ein Objekt nicht durch den Konstruktor, sondern durch eine braced-init-list, die dann entweder die einzelnen Member nacheinander initialisiert, oder einen entsprechenden Ctor aufruft. Das nennt sich Listen-Initialisierung (engl. "list-initialization"), und funktioniert nur bei Klassen die entweder keinen Konstruktor definieren, oder die einen definieren, bei dem die Elemente der init-list ohne narrowing-conversion in die Konstruktor-Parameter konvertiert werden können.
-
Sone schrieb:
Deine Art von Initialisierung ist allerdings in 12.6.1, Klausel 2/3 definiert. Es ist eine spezielle Art von Initialisierung: Man initialisiert hierbei ein Objekt nicht durch den Konstruktor, sondern durch eine braced-init-list, die dann entweder die einzelnen Member nacheinander initialisiert, oder einen entsprechenden Ctor aufruft. Das nennt sich Listen-Initialisierung (engl. "list-initialization"), und funktioniert nur bei Klassen die entweder keinen Konstruktor definieren, oder die einen definieren, bei dem die Elemente der init-list ohne narrowing-conversion in die Konstruktor-Parameter konvertiert werden können.
Das hier ist aber keine list-initialization sondern eine aggregate-initialization, oder? Seit C++1 ist das irgendwie verwirrend.
-
out schrieb:
Sone schrieb:
Deine Art von Initialisierung ist allerdings in 12.6.1, Klausel 2/3 definiert. Es ist eine spezielle Art von Initialisierung: Man initialisiert hierbei ein Objekt nicht durch den Konstruktor, sondern durch eine braced-init-list, die dann entweder die einzelnen Member nacheinander initialisiert, oder einen entsprechenden Ctor aufruft. Das nennt sich Listen-Initialisierung (engl. "list-initialization"), und funktioniert nur bei Klassen die entweder keinen Konstruktor definieren, oder die einen definieren, bei dem die Elemente der init-list ohne narrowing-conversion in die Konstruktor-Parameter konvertiert werden können.
Das hier ist aber keine list-initialization sondern eine aggregate-initialization, oder? Seit C++1 ist das irgendwie verwirrend.
Aggregat-Initialisierung durch Initialisierungsliste ist (eine spezielle Form der) List-Initialisierung. Leider reflektiert die Gliederung des neuen Standards das nicht.
-
camper schrieb:
out schrieb:
Sone schrieb:
Deine Art von Initialisierung ist allerdings in 12.6.1, Klausel 2/3 definiert. Es ist eine spezielle Art von Initialisierung: Man initialisiert hierbei ein Objekt nicht durch den Konstruktor, sondern durch eine braced-init-list, die dann entweder die einzelnen Member nacheinander initialisiert, oder einen entsprechenden Ctor aufruft. Das nennt sich Listen-Initialisierung (engl. "list-initialization"), und funktioniert nur bei Klassen die entweder keinen Konstruktor definieren, oder die einen definieren, bei dem die Elemente der init-list ohne narrowing-conversion in die Konstruktor-Parameter konvertiert werden können.
Das hier ist aber keine list-initialization sondern eine aggregate-initialization, oder? Seit C++1 ist das irgendwie verwirrend.
Aggregat-Initialisierung durch Initialisierungsliste ist (eine spezielle Form der) List-Initialisierung. Leider reflektiert die Gliederung des neuen Standards das nicht.
Schade. Ich habe mich an eben dem orientiert.