Probleme beim Initialisieren eines vektors als Klassen-Variable
-
Hey @all,
und zwar habe ich folgendes Problem, ich habe also eine Klasse, in der ein Vektor als private deklariert ist:
class Irgendwas { private: vector<string> StrVec; void init(); ... public: ... };
Nun möchte ich in der Methode init() den Vektor initialisieren, ohne das ich ca. 200 mal das mit push_back mache:
void Irgendwas::init() { this->StrVec.push_back("Test1"); this->StrVec.push_back("Test2"); this->StrVec.push_back("Test3"); }
Also in etwas so:
void Irgendwas::init() { this->StrVec[] = {"Test1", "Test2", "Test3"}; }
Nur funktioniert das nicht ganz so wie ich will, kann mir da vielleicht jemand
helfen. Wäre für jede Hilfe dankbarMfG Roman1311
-
Ich glaub nicht ,dass das so geht, lass mich aber gerne belehren
mfg
Glamdring
-
Warum verwendest du nicht den Konstruktor?
Was du noch könntest: denn vector zuerst auf die richtige Größe bringen (im Ctor, oder resize) und dann mit dem indexoperator die elemente anpassen.
push_back ist aber sicher effizienter (vorher speicher reservieren).wenn es außerdem standardwerte sind, kannst du es im Ctor so machen:
Irgendwas::Irgendas() : my_vector(100, "blub") {}
-
OK, das heisst, es wird mir nichts anderes übrigbleiben, als das ich die 200 mal mit push_back mache. Dachte nur es geht auch irgendwie einfacher. Wie ginge das ganze mit:
class Irgendwas { private: string Str[]; void init(); ... public: ... }; . . . void Irgendwas::init() { this->Str[] = {"Test1", "Test2", "Test3"}; }
Da funktioniert das aber leider auch nicht.
Nebenbei noch eine andereFrage: Kennt Ihr zufällig irgend ein gutes Buch, oder Webseite, wo Elemente wie list, queue, vector, map, multiset, ... erklärt werden?
MfG Roman1311
-
auf http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
mfg
Glamdring
-
@Roman:
Mit was willst Du den Vektor denn initialisieren?
Was hältst Du von einer Schleife? Da brauchst Du zwar auch 200 push_backs, aber Du mußt es nur einmal tippen.MfG Jester
-
Jester schrieb:
Was hältst Du von einer Schleife? Da brauchst Du zwar auch 200 push_backs, aber Du mußt es nur einmal tippen.
generate ginge aber auch.
Roman1311 schrieb:
class Irgendwas { private: string Str[]; void init(); ... public: ... }; . . . void Irgendwas::init() { this->Str[] = {"Test1", "Test2", "Test3"}; }
Da funktioniert das aber leider auch nicht.
da wirst du auch eine schleife oder irgendwelche fill algorithmen brauchen.
warum verwendest du einen init methode? warum nicht den konstruktor?
-
init ist private, daher vermute ich, er ruft init vom Konstruktor aus auf, um den Code übersichtlich zu halten. Klingt eigentlich vernünftig.
-
Ich wollte es eigentlich so wie unter C machen
char *Array[] = {"Text1", "blabla", "noch ein Text", "und schon wieder"};
Nur wollte ich das als Klassenvariable deklarieren, und danach in der Methode init() initialisieren, ohne das ich untereinander 200 push_back einträge habe.
@Jester: Hast recht, ich rufe unter anderem die init()-Methode im Konstruktor auf. Den ich habe schon bei grösseren Projekten gemerket, je mehr man splittet, desto mehr kann man den Code wieder in einem anderen Projekt verwenden.
@Devie: Die Werte sind statisch, und auch nicht mit einer Schleife lösbar, außer ich verschiebe es von einem Array in ein anderes, und das kann man auch besser über einen Kopierkonstruktor lösen
Nun zu meinem Problem, es muss doch unter C++ irgendeine Möglichkeit geben um es genauso in einer Methode zu initialisieren, nur möchte ich halt nicht mit "char*" sondern mit string oder sonst einer STL, weil ich die STL-Methoden später noch brauche(find, replace, substr, ...). Deshalb wäre mir ein String oder Vector schon lieber.
MfG Roman1311
-
Naja, im Prinzip gibt's zwei Möglichkeiten das dennoch zu erreichen.
-
Du legst in der Funktion lokal das Array mit den Werten an, so wie in C und kopierst die Werte dann in Deinen vector.
-
Du liest die Werte aus einer Datei direkt in den vector.
MfG Jester
-
-
Das heisst in etwas so?:
char *Array[] = {"Text1", "blabla", "noch ein Text", "und schon wieder"}; for(int i=0; i<4; i++) StrVec.push_back(Array[i]); delete [] Array;
Nur kann ich das Array dann mit "delete [] Array;" löschen, denn sonst habe ich unnötigen Speicherverbrauch.
MfG Roman1311
-
doppelt
-
Das mit dem löschen würd ich mal lieber lassen, die Daten liegen nämlich auf dem Stack... und werden damit automatisch freigegeben, wenn Du die Funktion verläßt. Was bei delete passiert kann ich Dir nicht sagen, ich weiß nur so viel: im günstigsten Fall stürzt Dein Programm ab.
Merke: immer nur Sachen mit delete freigeben, die zuvor mit new angefordert wurden. kein new => kein delete.
Eigentlich ganz einfach,
Jester
-
Jester schrieb:
Das mit dem löschen würd ich mal lieber lassen, die Daten liegen nämlich auf dem Stack... und werden damit automatisch freigegeben, wenn Du die Funktion verläßt. Was bei delete passiert kann ich Dir nicht sagen, ich weiß nur so viel: im günstigsten Fall stürzt Dein Programm ab.
das heißt, folgendes funktioniert nicht:
const char *greet (int which) { const char *text[] = { "Welcome", "Willkommen", "Yoroshiku", "Bienvenu" }; return text[which%4]; } int main() { extern int language; cout << greet(language) << endl; }
und folgendes auch nicht:
const char *foo () { return "ho"; } int main () { cout << foo() << endl; }
Die Codes sind übrigens OK