Größe eines String Arrays vorher nicht bekannt - was wird eingetragen in []
-
Hallo !
Gibt es eine Möglichkeit in ein String Array eine Größe einzutragen, die auf jeden Fall passt, wenn man vorher nicht weiss, wie groß der String wird ?
Heinz
-
Also so wie ich das verstehe willst du ein array aus strings anlegen und weißt nicht wie viele strings letzten Endes reinkommen. Da kannst du entweder dynamisch Speicher allokieren oder du machst am Anfang ein #include <vector>
und dann vector<string> wunschname;
mit wunschname.push_back("element") kannst du dann Elemente einfügen, und zwar beliebig viele. Ein vector wächst grade auf die Größe die benötigt wird. wunschname[i] liefert dann das Element an der i-ten Stelle.
Probiers aushendrik
-
Hallo !
Ja genau, ich will Dateien zeilenweise einlesn und da man ja nie weiss, wieviele Zeilen da so drin sind, kenn ich den Wert nicht.
Mit dem Vector hört sich gut an- probier ich aus.
Wie war das mit dem Speicher allokieren - wie funktioniert das ?
Heinz
Gast2112 schrieb:
Also so wie ich das verstehe willst du ein array aus strings anlegen und weißt nicht wie viele strings letzten Endes reinkommen. Da kannst du entweder dynamisch Speicher allokieren oder du machst am Anfang ein #include <vector>
und dann vector<string> wunschname;
mit wunschname.push_back("element") kannst du dann Elemente einfügen, und zwar beliebig viele. Ein vector wächst grade auf die Größe die benötigt wird. wunschname[i] liefert dann das Element an der i-ten Stelle.
Probiers aushendrik
-
Also ich würde den vector nehmen.
Mit dynamischer Speicherallokation kenn ich mich auch nicht so richtig aus.
Wenn du dir zum Beispiel dein array selbst implementierst mitstruct word
{
string value;
zeile* next;
};dann kannst du mit new neuen Speicher anfordern und ein Wort an ein anderes dranhängen:
word neues_wort=new word;
neues_wort.value="abcd";
neues_wort.next=0;altes_wort.next=&neues_wort;
Das ist ziemlich kompliziert weil du den ganzen Müll nachher mit delete wieder löschen solltest und dir außerdem immer die Adresse des jeweils letzten Wortes merken musst damit sowas wie altes_wort.next=&neues_wort; überhaupt klappt. Und bei der Arbeit mit pointern passieren leicht Fehler die zudem noch schwer zu finden sind.
Beim vector muss man zwar <vector> includieren, hat aber dann ein paar sehr nette und bequeme Funbktionen zur Auswahl.
hendrik
-
Hallo !
Ja, mit der Vector Methode funktioniert es tatsächlich
- Vielen, vielen Dank.
Kann ich die auch außer bei String Array auch bei einem char Array Anwenden ?
Heinz
Gast2112 schrieb:
Also ich würde den vector nehmen.
Mit dynamischer Speicherallokation kenn ich mich auch nicht so richtig aus.
Wenn du dir zum Beispiel dein array selbst implementierst mitstruct word
{
string value;
zeile* next;
};dann kannst du mit new neuen Speicher anfordern und ein Wort an ein anderes dranhängen:
word neues_wort=new word;
neues_wort.value="abcd";
neues_wort.next=0;altes_wort.next=&neues_wort;
Das ist ziemlich kompliziert weil du den ganzen Müll nachher mit delete wieder löschen solltest und dir außerdem immer die Adresse des jeweils letzten Wortes merken musst damit sowas wie altes_wort.next=&neues_wort; überhaupt klappt. Und bei der Arbeit mit pointern passieren leicht Fehler die zudem noch schwer zu finden sind.
Beim vector muss man zwar <vector> includieren, hat aber dann ein paar sehr nette und bequeme Funbktionen zur Auswahl.
hendrik
-
Klar das geht für jeden Typ, auch für structs. Je nachdem was du in die spitzen Klammern schreibst. Z.B. vector<char> wunschname;
Mit wunschname.push_front(element) kannst du auch Elemente vorne dranhängen.
wunschname.size(); liefert die Anzahl der zur Zeit im vector enthaltenen Elemente.hendrik
-
Hi,
na ja, einzelne chars an einem vector bringt ja nix. Wenn Du aber Zeichenketten speichern willst, mußt Du einen std::vector<char*> nehmen, und Dich schon wieder selbst um die Speicherverwaltung der einzelnen Chararrays kümmern. da ist std::string doch um Welten besser.
grüß0e Con@n