Datei in einen vector <string> einlesen. Doppeltes Kopieren?
-
oh! schrieb:
na sowas, *staun*, wassn das fürne funktion: string()
Der Konstruktor von String natürlich. Was LordJaxom da zeigt ist ganz einfach: Anstatt in einen temporären String zu lesen und den zu kopieren, fügt er einen leeren String in den vector ein und liest dann in den leeren String.
-
Geht ja doch ohne die string Zwischenstation
So gefällt mir das.
-
LordJaxom schrieb:
...
lines.back()...
Oh Mann !!
*dreimal-vor-die-stirn-klatsch*Da habe ich immer mit "[size()-1]" rumgefummelt und es gibt ein Member dafür!
Peinlich .... aber man lernt eben nie aus!Danke,
Simon2.
-
Simon2 schrieb:
LordJaxom schrieb:
...
lines.back()...
Oh Mann !!
*dreimal-vor-die-stirn-klatsch*Da habe ich immer mit "[size()-1]" rumgefummelt und es gibt ein Member dafür!
Peinlich .... aber man lernt eben nie aus!Danke,
Simon2.
Ja, ein selten gesehener Gast
ebenso wie front() - wie oft sieht man stattdessen vec[0]
-
Warum nicht mit back_inserter und istream_iterator?
-
Stream-Iteratoren schrieb:
Warum nicht mit back_inserter und istream_iterator?
Hat sich erledigt, habe übersehen, dass ganze Zeilen gelesen werden sollen.
Würde aber dennoch folgende Methode bevorzugen:
bool read_file(std::ifstream &in, std::vector<std::string> &lines) { do { lines.push_back(std::string()); } while(getline(in, lines.back())); return !!in; // gerade kein compiler zur hand ob auch return in; geht }
-
move ftw!
std::string tmp; while (getline(in, tmp)) lines.push_back(std::move(tmp));
-
@Stream-Iteratoren:
1x pop_back() vergessen, sonst hast du eine leere zeile zuviel am ende von "lines" (pop_back, was für ein Name für eine Funktion)
und... wenn die schleife abbricht, wird der returnwert auch immer false sein so wie du das machst. nicht?
-
hustbaer schrieb:
@Stream-Iteratoren:
1x pop_back() vergessen, sonst hast du eine leere zeile zuviel am ende von "lines" (pop_back, was für ein Name für eine Funktion)
und... wenn die schleife abbricht, wird der returnwert auch immer false sein so wie du das machst. nicht?
Ja, alte angewohnheit von mir, wenn nicht so etwas wie is im Namen Stimmt du hast recht, aber war auch schon spät
auftaucht, dass ist 0 der Rückgabewert für Erfolg.
-
Stream-Iteratoren schrieb:
hustbaer schrieb:
@Stream-Iteratoren:
1x pop_back() vergessen, sonst hast du eine leere zeile zuviel am ende von "lines" (pop_back, was für ein Name für eine Funktion)
und... wenn die schleife abbricht, wird der returnwert auch immer false sein so wie du das machst. nicht?
Ja, alte angewohnheit von mir, wenn nicht so etwas wie is im Namen Stimmt du hast recht, aber war auch schon spät
auftaucht, dass ist 0 der Rückgabewert für Erfolg.Oh da ist aber einiges durcheinander geraten, hier die richtig formatierte Version:
Stimmt du hast recht, aber war auch schon spät
Ja, alte angewohnheit von mir, wenn nicht so etwas wie is im Namen auftaucht, dass ist 0 der Rückgabewert für Erfolg.
-
@Stream-Iteratoren:
Ich meinte dass die Funktion *immer* false zurückgibt, und der Rückgabewert dadurch total sinnlos ist.
-
und was macht dieses move? da wird doch auch bloss unnütz kopiert, oder?
-
mov0r schrieb:
und was macht dieses move? da wird doch auch bloss unnütz kopiert, oder?
Lesen http://en.wikipedia.org/wiki/C%2B%2B0x#Rvalue_reference_and_move_semantics
-
volkard schrieb:
mov0r schrieb:
und was macht dieses move? da wird doch auch bloss unnütz kopiert, oder?
Lesen http://en.wikipedia.org/wiki/C%2B%2B0x#Rvalue_reference_and_move_semantics
ja, danke, ich konnts nicht finden.
aber das move ding hab ich nicht:error C2039: 'move': Ist kein Element von 'std'
-
mov0r schrieb:
aber das move ding hab ich nicht:
C++0x
Mußt Du noch nicht haben, ist aber bald da, weshalb es jetzt für Performance-Überlegungen schon miteinbezogen wird.