2016-04-23 10 views
6

Diese Frage zeigt, wie Sie eine string in eine vector mit einem einzelnen Zeichen Delimeter teilen.Split std :: wstring in std :: vector

Frage:Right way to split an std::string into a vector

jedoch diese Technik wstring Anwendung ist nicht so einfach, wie ich dachte. Daher ist dies definitiv kein Duplikat überhaupt.

wstringstream stringStream(str); 
istream_iterator<wstring> begin(stringStream); 
istream_iterator<wstring> end; 
List = vector<wstring>(begin, end); 
copy(List.begin(), List.end(), ostream_iterator<wstring>(cout, ";")); 

Die zweite Zeile kann nicht mit VS2015 kompiliert werden. Und mit istream_iterator<wstring, wchar_t> verursacht einen Kompilierungsfehler in iterator.h.

Wie kann ich Split ein std::wstring in eine std::vector, die von ";" getrennt ist?

Antwort

6

Sie können die Methode in Ihrem Beispiel nicht verwenden. Diese Methode beruht darauf, dass die Eingabe ein separater Weißraum ist. In deiner Frage sagst du deine Strings eine ; getrennt wie "the;quick;brown;fox". Um dies zu tun, können Sie std:getline mit ';' als Trennzeichen verwenden, um die Zeichenfolge aufzubrechen.

std::wstring str = L"the;quick;brown;fox", temp; 
std::vector<std::wstring> parts; 
std::wstringstream wss(str); 
while(std::getline(wss, temp, L';')) 
    parts.push_back(temp); 

Die oben lädt die Zeichenfolge in den Strom und wird dann halten std::getline Brechen am ';' ‚s Aufruf, bis das Ende des Stroms erreicht.

Ich möchte auch darauf hinweisen, dass Ihr zweites Beispiel hatte die Daten geteilt würden Sie es nicht als

gesehen haben
copy(List.begin(), List.end(), ostream_iterator<wstring>(cout, ";")); 

Wird die setzen ‚;‘ direkt zurück in die Saite. Es benötigt auch std::wcout anstelle von std::cout, da Sie mit breiten Zeichen zu tun haben.

Nach cppreference ctype hat zwei verschiedene Spezialisierungen für char und wchar_t und die haben unterschiedliche Funktion. Sie können nicht nur alle Vorkommen von ctype<char> mit ctype<wchar_t> ändern und als ctype<wchar_t> fehlende Funktionen ausgeführt werden, die das zweite Beispiel verwendet

+0

Diese Methode funktioniert auf 'std :: string' mit"; " obwohl. So funktioniert es nur mit einem Leerraum ist falsch. Aber ich werde jetzt dein Beispiel versuchen. – bytecode77

+0

@ bytecode77 Der in Ihrem Beispiel angezeigte Code verwendet nicht die zweite Methode, die basierend auf anderen Zeichen aufgeteilt werden kann. Wenn Sie diese Version verwenden, sollten Sie Ihr Beispiel aktualisieren. – NathanOliver

+0

Könnte einen Schnitt wert sein, um nach Hause zu schlagen, dass in Ostream_iterator (cout, ";") 'in OP-Beispiel all ';' macht gerade ein ';' nach jedem String beim Ausgeben des Vektors. Und da die Ausgabe nach der Teilung der Zeichenkette stattfindet, kann sie keine Auswirkungen auf die Aufteilung haben. – user4581301