vector möglichst schnell füllen
-
Wie ist die einfachste und/oder schnellste Art, einen vector zu füllen, wenn Inhalt und Länge schon absehbar sind?
Es kommt mir arg plump vor, n-mal push_back aufzurufen. Ich denke mal, da gibt's was besseres. Aber was?
-
ja naklar du füllst es einfach in einer schleife und rufst so möglicherweise nur einmal push_back() auf. du müsstest mal etwas code zeigen um die problematik etwa besser zu verdeutlichen.
-
std::fill?
-
Und um die Länge festzulegen
resizeoder im Konstruktor eben die Anzahl festlegen.
-
Der Inhalt ist ja nicht immer der selbe. Demzufolge hat eine Schleife keinen Sinn.
fill müsste ich mir mal anschauen.
Ansonsten habe ich jetzt erstmal einfach mittels copy and paste auf insert umgestellt. Aber mit Iteratoren müsste ich mich da wohl nochmal ausführlicher beschäftigen. Die sind meiner Meinung nach einfach unsinnig.
Okay, um die Situation zu erklären, mein jetziger Code:
vector<string> AxisNames() { vector<string> axisNames; string names[] = {"X_AXIS", "Y_AXIS", "Z_AXIS", "NEG_X_AXIS", "NEG_Y_AXIS", "NEG_Z_AXIS"}; axisNames.insert(axisNames.begin(), names, names+6); return axisNames; }
-
Den Konstruktor benutzen?
vector<string> AxisNames() { string names[] = {"X_AXIS", "Y_AXIS", "Z_AXIS", "NEG_X_AXIS", "NEG_Y_AXIS", "NEG_Z_AXIS"}; vector<string> axisNames(names, names+6); return axisNames; }
-
Wenn du schon vorher ein Array oder anderen Container mit den zu fuellenden Werten hast, dann nimm einfach den range-Ctor von vector:
template <class Iter> vector(Iter first, Iter last);Wenns n-mal der selbe Wert sein soll gibts folgenden Ctor:
vector(size_type n, const T& value = T());(beide Konstruktoren haben noch die Uebergabe eines Allokators als optionales dritte Argument, aber das ist in dem Fall ja nicht von Interesse)
-
vector<string> AxisNames() { string names[] = {"X_AXIS", "Y_AXIS", "Z_AXIS", "NEG_X_AXIS", "NEG_Y_AXIS", "NEG_Z_AXIS"}; return vector<string>( &names[0], &names[sizeof(names)/sizeof(names[0])] ); }Ich weiß aber nicht, ob der vector sich vorher auf die richtige Größe bringt, oder auch nur push_back verwendet.
ups, spät

-
David Schneider schrieb:
Der Inhalt ist ja nicht immer der selbe. Demzufolge hat eine Schleife keinen Sinn.
fill müsste ich mir mal anschauen.
Ansonsten habe ich jetzt erstmal einfach mittels copy and paste auf insert umgestellt. Aber mit Iteratoren müsste ich mich da wohl nochmal ausführlicher beschäftigen. Die sind meiner Meinung nach einfach unsinnig.
Okay, um die Situation zu erklären, mein jetziger Code:
vector<string> AxisNames() { vector<string> axisNames; string names[] = {"X_AXIS", "Y_AXIS", "Z_AXIS", "NEG_X_AXIS", "NEG_Y_AXIS", "NEG_Z_AXIS"}; axisNames.insert(axisNames.begin(), names, names+6); return axisNames; }Das Einzige was IMO hier noch zu verbessern ist ist reserve() zu verwenden:
vector<string> AxisNames() { vector<string> axisNames; string names[] = {"X_AXIS", "Y_AXIS", "Z_AXIS", "NEG_X_AXIS", "NEG_Y_AXIS", "NEG_Z_AXIS"}; axisNames.reserve(6); // <--- axisNames.insert(axisNames.begin(), names, names+6); return axisNames; }
-
Wobei die Range-Konstruktoren und -Einfügeoperationen "blöd" wären, wenn sie sich nicht den Umstand zunutze machten, dass man Forward-Iteratoren durchzählen und bei Random-Access-Iteratoren die Länge sogar direkt bestimmen kann.
-
Jo, OK, hast recht. Von daher ist der 2-Iterator-Konstruktor wahrscheinlich noch besser.
Effektiv wird vermutlich beides inetwa gleich schnell laufen - zumindest bei einem std::vectorstd::string, allerdings bei anderen Typen (char, int, ...) könnte der 2-Iterator-Konstruktor schon nen Stück schneller sein.