Invalid conversion und forbids comparison
-
Ich weiß zwar nicht, ob diese Lösung flotter ist als deine, aber einfacher ist sie auf alle Fälle:
std::vector<std::string> split(std::string text, char delim) { std::stringstream ss(std::move(text)); std::vector<std::string> result; while(std::getline(ss, text, delim)) result.push_back(std::move(text)); return result; }
-
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.std::vector<std::string> splittolines(std::string text) { std::vector<std::string> erg; char newline = '\n'; for (size_t i = 0; i < text.length(); i++) { std::string s; if (text.at(i) == newline) { erg.push_back(s); } else { s.append(text.at(i)); } } return erg; }
-
Mach doch ein
s += text[i];daraus.
-
bluepeople12 schrieb:
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.What?
-
314159265358979 schrieb:
Mach doch ein
s += text[i];daraus.
Ändert doch nichts an der Tatsache, dass ich hier
if (text.at(i) == newline)ein Problem hab ...

-
append möchte andere Argumente, als du ihm gibst:
http://www.cplusplus.com/reference/string/string/append/Und nimm 314159265358979s Vorschlag, der ist in jeder Hinsicht besser. Dein Argument verstehe ich überhaupt nicht (sowohl sprachlich als auch das was ich mir inhaltlich zusammen reime, was du wohl meinst):
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.
-
Du machst was anderes falsch, der Vergleich ist richtig. Statt .at() solltest du trotzdem [] verwenden, da i sowieso keine Werte größer der Länge des Strings - 1 annehmen kann.
-
Ach Jungs, tut mir leid. War mein Fehler. Ihr habt Recht, ich hätte es so schreiben müssen:
s += text[i];
-
Hm...
Was haltet ihr davon?
template <typename C, typename T, typename A> std::vector<std::basic_string<C, T, A>> split(std::basic_string<C, T, A> text, C delim) { std::basic_stringstream<C, T, A> ss(std::move(text)); std::vector<std::basic_string<C, T, A>> result; while(std::getline(ss, text, delim)) result.push_back(std::move(text)); return result; }
-
Welchen Header hat std::stringstream ?
-
<sstream>
-
Warum kommt dann jetzt immer das hier ?
Functions.cpp: In function ‘std::vector<std::basic_string<char> > split(std::string, char)’:
Functions.cpp:67:26: error: ‘move’ is not a member of ‘std’
Functions.cpp:71:26: error: ‘move’ is not a member of ‘std’
make: *** [Functions.o] Error 1
-
#include <utility>
C++0x musst du auch aktivieren, ansonsten die moves weglassen. (Dadurch wird der Code aber ineffizienter.)
-
Wenn ich die moves weglassen möchte und nicht auf dieses C++0X aufsteigen, reicht es wenn ich std::move wegmache oder muss ich noch was anderes machen ?
-
Du willst aber auf den C++0x Zug aufspringen, denn das ist die Zukunft.
Nein, musst du nicht, aber du solltest den Parameter zuconst std::string&ändern.
Edit: Unter Visual Studio ist C++0x übrigens von Haus aus aktiviert, wenn du die 10er Version hast.
-
Die aktuelle Funktion schaut so aus, bringt aber noch nciht ganz das erwünschte ...

std::vector<std::string> split(const std::string& text, char delim) { std::stringstream ss(text); std::vector<std::string> result; while(std::getline(ss, text, delim)) result.push_back(text); return result; }Functions.cpp: In function ‘std::vector<std::basic_string<char> > split(const std::string&, char)’:
Functions.cpp:69:39: error: no matching function for call to ‘getline(std::stringstream&, const std::string&, char&)’
make: *** [Functions.o] Error 1
-
Öh ja. Sorry, da hab ich mich doch glatt vertan. Bau sie so um:
std::vector<std::string> split(const std::string& text, char delim) { std::stringstream ss(text); std::vector<std::string> result; std::string substr; while(std::getline(ss, substr, delim)) result.push_back(substr); return result; }Um nochmal meinen Edit zu wiederholen, falls du ihn überliest: Wenn du MSVC 10 verwendest, ist C++0x von Haus aus aktiviert.
-
314159265358979 schrieb:
Um nochmal meinen Edit zu wiederholen, falls du ihn überliest: Wenn du MSVC 10 verwendest, ist C++0x von Haus aus aktiviert.
Ich hab hier ein Projekt, dass ich mit Linux machen soll...
-
Dann wäre das beim GCC --std=c++0x in der Kommandozeile

-
bluepeople12 schrieb:
314159265358979 schrieb:
Um nochmal meinen Edit zu wiederholen, falls du ihn überliest: Wenn du MSVC 10 verwendest, ist C++0x von Haus aus aktiviert.
Ich hab hier ein Projekt, dass ich mit Linux machen soll...
Alle gängigen Linuxcompiler kennen auch sehr viel von C++11 (tendenziell sogar viel mehr als MSVC). Gib mal -std=c++0x beim compilieren mit an.