C++ Vector auf String Pointer
-
Finde ich auch, aber wollte es mal probieren.
314159265358979_ schrieb:
Aus welchem Buch hast du denn diese Aufgabe
C++ Primer (4. Auflage / Deutsch). Wobei ich das Gefühl habe, dass es bei der Übersetzung einige Fehler hat (möglicherweise, auch bei so Aufgabenstellungen).
Gruss,
cvec
-
Tja.. ich muss Pi_ zustimmen, auch wenn es der vielgelobte Primer ist. Ohne weiteren Kontext macht die Aufgabe keinen Sinn. Du kannst das eigentlich einfach so lösen:
int main() { using namespace std; cout << "How many strings? "; unsigned count; cin >> count; vector<string> strings(count); for (auto i = begin(strings); i != end(strings); ++i) std::cin >> *i; }Oder halt gleich push_back()-en, bis ein leerer String gefunden wurde oder so. Aber Pointer machen einfach keinen Sinn..
-
Ok, vielen Dank für die Erklärung.
Und um die Grösse auszugeben, kann ich da so vorgehen: *(i).size()?
Würde es gerade gern ausprobieren, bin jedoch gerade nicht am Computer...Auf jeden Fall, Danke!
Gruss,
cvec
-
Ja, (*i).size() wäre eine Möglichkeit. Aber dafür gibt es einen Shortcut:
i->size();
-
Ich habe das jezt mal so umgesetzt....
int main() {
unsigned n;
cout << "Anzahl Strings: ";
cin >> n;
vector<string> strings(n);for (vector<string>::iterator i = strings.begin(); i != strings.end(); ++i) {
cin >> *i;
}for(vector<string>::iterator i=strings.begin(); i != strings.end(); ++i) {
cout << *i << endl;
}return(0);
}Ähnlich wie vorgeschlagen, das funkioniert auch. Jedoch wenn ich versuche die Strings mit getline einzulesen (*getline(cin, i)) dann liest er ein String zu wenig ein

Also wenn ich bei der Anzahl 3 eingeben und mit cin einlese, kann ich auch drei Strings eingeben, bei *getline(cin, i) jedoch nur zwei...
Was tut den genau getline da?
Vielen Dank für die bisherige Hilfe!

Gruss,
cvec
-
314159265358979_ schrieb:
Hallöle,
Sorry, aber die Aufgabenstellung ist sinnlos. Wozu Zeiger auf Strings speichern, wenn man direkt Strings speichern könnte? Damit brauchst du dich auch nicht um das Freigeben des Speichers kümmern. Aus welchem Buch hast du denn diese Aufgabe?
Grüße,
PIWenn die Dinger 1-x mal kopiert werden, ja so ein Pointer-Vector durchaus eine Menge Sinn machen.
-
Versuch nicht, mit Gewalt nen Fall zu konstruieren, in dem ich unrecht hab.
-
Ethon schrieb:
314159265358979_ schrieb:
Hallöle,
Sorry, aber die Aufgabenstellung ist sinnlos. Wozu Zeiger auf Strings speichern, wenn man direkt Strings speichern könnte? Damit brauchst du dich auch nicht um das Freigeben des Speichers kümmern. Aus welchem Buch hast du denn diese Aufgabe?
Grüße,
PIWenn die Dinger 1-x mal kopiert werden, ja so ein Pointer-Vector durchaus eine Menge Sinn machen.
Ähm nö.
Höchstens einenvector<unique_ptr<string>>zumoven. Dann kann man aber auch einfachvector<string>schreiben.
-
TyRoXx schrieb:
Ethon schrieb:
314159265358979_ schrieb:
Hallöle,
Sorry, aber die Aufgabenstellung ist sinnlos. Wozu Zeiger auf Strings speichern, wenn man direkt Strings speichern könnte? Damit brauchst du dich auch nicht um das Freigeben des Speichers kümmern. Aus welchem Buch hast du denn diese Aufgabe?
Grüße,
PIWenn die Dinger 1-x mal kopiert werden, ja so ein Pointer-Vector durchaus eine Menge Sinn machen.
Ähm nö.
Höchstens einenvector<unique_ptr<string>>zumoven. Dann kann man aber auch einfachvector<string>schreiben.Der Primer ist kein C++11 Buch, also ist dein Tipp etwas daneben.

Und selbst dann falsch...
Stell dir mal vor mehrere Objekte sollen den Vector für sich kopieren und modifizieren, also sortieren, Elemente rauswerfen, neue hinzufügen etc. Das geht nicht wenn nur ein Objekt exklusiven Zugriff auf den Vector hat.Mit shared_ptr würde es passen, nur geht der Overhead wohl über die Unbequemlichkeit delete aufzurufen bzw Boost zu verwenden.
-
Ethon schrieb:
Und selbst dann falsch...
Stell dir mal vor mehrere Objekte sollen den Vector für sich kopieren und modifizieren, also sortieren, Elemente rauswerfen, neue hinzufügen etc. Das geht nicht wenn nur ein Objekt exklusiven Zugriff auf den Vector hat.Dann übergibt man den Vektor über einen Pointer (Referenz), und macht nicht seine Elemente zu Pointern.
Aber schreibe uns doch gerne mal ein Beispiel mit Code, in dem ein std::vectorstd::string* sinnvoller wäre.
-
Ethon schrieb:
Mit shared_ptr würde es passen, nur geht der Overhead wohl über die Unbequemlichkeit delete aufzurufen bzw Boost zu verwenden.
Dass man
deletenicht benutzt liegt nicht an der Bequemlichkeit.Zuletzt ging es um einen Vektor, der die Strings besitzt. Irgendwie schwebten dann noch Zeiger im Raum. Beides zusammen geht zur Not mit
shared_ptrim alten C++.Gegen das Hantieren mit Mengen nicht-besitzender Zeiger spricht überhaupt nichts.
-
cooky451 schrieb:
Aber schreibe uns doch gerne mal ein Beispiel mit Code, in dem ein std::vectorstd::string* sinnvoller wäre.
Muss es std::string sein? Ansonsten bastel ich mein Beispiel noch ein bisschen um.
-
Na ja, es sollte schon in etwa gleichwertig sein. (Aber ob es jetzt std::string oder std::vector ist dürfte wohl egal sein.)
-
Hallo...
Beim folgenden Code funktioniert eigendlich so weit alles. Wenn ich bei Zeile 11 statt "getline(cin, *i)" "cin >> *i" verwende, funktioniert alles normal. Mit getline(cin, *i) jedoch erscheint bei der Ausführung folgendes:
Anzahl Strings: 4
1: 2:Da wird die Eingabe für die eins einfach übersprungen? Wiso?
Bitte um Hilfe!int main() { unsigned n; cout << "Anzahl Strings: "; cin >> n; vector<string> strings(n); int a=1; for(vector<string>::iterator i=strings.begin(); i != strings.end(); ++i){ cout << a << ": "; getline(cin, *i); ++a; } return(0); }
-
Wenn du die Anzahl mit "cin >> n;" einliest, bleibt ein '\n' im Puffer. getline() ignoriert führende Whitespaces aber nicht, sodass der erste String sofort eingelesen wird und nur aus '\n' besteht. Du könntest das z.B. lösen, indem du ein cin.ignore(numeric_limits<streamsize>::max(), '\n') dazwischen packtst. Das ignoriert eine Zeile.
-
@cooky451
Danke. Das habe ich mir eben auch gedacht, danach habe ich versucht das so zu lösen:cout << a << ": " << endl; getline(cin, *i);Weil ich denke, das der endl den Puffer leert, jedoch funktionierte es so auch nicht...
Naja gut, danke für deine Mühe !
-
cout und cin sind doch auch ganz andere Streams, warum sollte ein endl auf cout einen Effekt auf cin haben?

-
cooky451 schrieb:
cout und cin sind doch auch ganz andere Streams, warum sollte ein endl auf cout einen Effekt auf cin haben?

Da habe ich einen Denkfehler gehabt, hast recht

getline(cin.ignore(numeric_limits<streamsize>::max(), '\n'), *i);
Das löst jezt das vorherige Problem, jedoch muss ich ab der zweiten Eingabe zweimal Enter betätigen...
Anzahl Strings: 4
1: String eins
2: String zwei3: Strin drei
4: String vier
Jezt ignoriert er dies... aber gut das ist mal nicht so schlimm, das ganze war ja nur eine Übung. Ich denke solche Themen werden noch im Verlauf des Buches mehr oder weniger behandelt.

-
So sollte eigentlich alles laufen, hast du das ignore in die Schleife gepackt?
int main() { using namespace std; cout << "Anzahl Strings: "; unsigned n; cin >> n; cin.ignore(numeric_limits<streamsize>::max(), '\n'); vector<string> strings(n); for (unsigned i = 0; i != strings.size(); ++i) { cout << i + 1 << ": "; getline(cin, strings[i]); } }
-
cooky451 schrieb:
So sollte eigentlich alles laufen, hast du das ignore in die Schleife gepackt?
Ja, bin aber nach dem Post drauf gekommen... ^^ sry!
Diese ignore() Methode kam bisher leider im Buch noch nicht vor.