zahlen aus std::string in std::vector
-
Dafür nimmst Du einen std::stringstream, schreibst den String da rein (wie in cout) und holst die Zahlen wieder raus (wie aus cin)

-
Hallo

Und wohin willst du das Umbiegen?So wie ich das versteh hast du einen string mit durch Leerzeichen getrennten Zahlenwerte. Und du willst das auftrennen und die einzelnen Werte in einen Integer-vector.
Und genau dazu nimmst du explode, und brauchst nur noch ein lexical_cast bzw. ein stringstream um die Teilstrings in Integers umzuwandeln.
Eventuell läßt sich das ganze auch ganz auf einen stringstream reduzieren.
bis bald
akari
-
std::stringstream ss("123 456 789"); int i; ss >> i; v.push_back(i);
-
re
naja mit stringstreams wuerde es ja auch funktionieren.
aber ich find da keine funktion wie ich dem stringstream nen string zuweissen kann, den er als buffer ansieht.
sonst muesste ich erst den string in den stringstream reinschieben, was aber recht unnoetiger zeitaufwand ist.
oder ich muesste nen haufen code umschreiben, das ein stringstream anstatt eines strings verwendet wird. worauf ich jetz auch nicht viel lust habe.Meep Meep
-
Hallo
du hast genug Vorschläge bekommen. Wenn dir keiner passt können wir dir auch nicht helfen.
bis bald
akari
-
Meep Meep schrieb:
re
naja mit stringstreams wuerde es ja auch funktionieren.
aber ich find da keine funktion wie ich dem stringstream nen string zuweissen kann, den er als buffer ansieht.Klar gibt es so eine Funktion, die nennt sich clevererweise str(s).
-
Second, str() can be used to copya string into the stream
Ich glaube es geht ihm darum die Kopie zu verhindern.
-
hola leute
bin jetzt nen kleinen schritt weiter gekommen.
hab mal von std::streambuf ne klasse abgeleitet:namespace txl { class StreamBuffer : public std::streambuf { private: public: StreamBuffer(std::string &str) { this->pubsetbuf(str.begin(), str.length()); } }; }und hab als kleines testprogramm folgendes genommen:
int main(int argc, char* argv[]) { std::string str = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 \n 14 15"; std::vector<int> vec; txl::StreamBuffer *buf = new txl::StreamBuffer(str); std::streambuf *old_buf = std::cin.rdbuf(); std::cin.rdbuf(buf); int x = 0; while(std::cin >> x) vec.push_back(x); std::cin.rdbuf(old_buf); for(unsigned int i = 0;i < vec.size();++i) { std::cout << vec[i] << std::endl; } std::cout << "originalstring: " << str << std::endl; return 0; } kompilieren tut es ohne meldungen. jedoch wird dann nur der originalstring ausgegeben. std::cin liefert schon beim ersten einlesen in x failbit. was hab ich da falsch gemacht ? Meep Meep
-
Einen Stream-Buffer zusammenzubauen ist imho Overkill für deine Zwecke (und selbst wenn, dann benötigt dein Buffer noch einige Hilfsfunktionen). Nimm lieber den vorgegebenen std::ostringstream, der macht genau das, was du benötigst.
(und noch einmal: Mit der Methode str() kannst du dem Stream einen neuen Eingabestring übergeben)
-
Sag mal, also ehrlich, das Einfügen des Strings in nen stringstream um ihn danach wie cin zu benutzen ist Dir zu aufwändig, aber dasselbe von hinten durch die Brust ins Auge durch eine neue Klasse und dreimal Zeigergehampel zu lösen passt Dir dann?!

-
wenn ich meinem StreamBuffer den string uebergebe, wird er dann ueber pubsetbuf n den stream kopiert ? oder nur ne referenz von wo std::cin da lesen kann ?
die strings haben ne groesse von 1-2 MB. und jedes mal zuerst den string in nen stream kopieren, is unnoetiger zeitaufwand. dachte das ich es mir so ersparen kann.Meep Meep