2016-04-23 2 views
6

Cette question montre comment diviser un string en un vector en utilisant un délimiteur .Division de std :: wstring en std :: vector

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

Cependant, l'application de cette technique à wstring est pas aussi facile que je pensais. Par conséquent, ce n'est certainement pas un doublon du tout.

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, ";")); 

La deuxième ligne ne peut pas être compilé avec VS2015. Et en utilisant istream_iterator<wstring, wchar_t> provoque une erreur de compilation dans iterator.h.

Comment puis-je diviser un std::wstring en std::vector qui est séparé par ";"?

Répondre

6

Vous ne pourrez pas utiliser la méthode dans votre exemple. Cette méthode repose sur l'entrée étant l'espace blanc séparé. Dans votre question vous dites vos chaînes un ; séparés comme "the;quick;brown;fox". Pour ce faire, vous pouvez utiliser std:getline avec ';' comme délimiteur pour rompre la chaîne.

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); 

Les charges au-dessus du string dans le flux, puis continueront à appeler std::getline rupture au ';' « s jusqu'à ce qu'il atteigne la fin du flux.

Je voudrais également souligner que votre deuxième exemple a divisé les données que vous ne l'auriez pas vu comme

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

Mettra le « ; » de retour dans la chaîne. Il a également besoin de std::wcout au lieu de car il s'agit de caractères larges.

Selon cppreference ctype a deux spécialisations différentes pour char et wchar_t et ont une fonction différente. Vous ne pouvez pas simplement changer toutes les occurrences de ctype<char> avec ctype<wchar_t> et être fait comme ctype<wchar_t> est des fonctions manquantes que le deuxième exemple utilise

+0

Cette méthode fonctionne sur 'std :: string' en utilisant"; " bien que. Donc, travailler uniquement avec un espace blanc est incorrect. Mais je vais essayer votre exemple maintenant. – bytecode77

+0

@ bytecode77 Le code que vous montrez dans votre exemple n'utilise pas la seconde méthode qui peut être divisée en fonction d'autres caractères. Si vous utilisez cette version, vous devriez mettre à jour votre exemple. – NathanOliver

+0

Cela pourrait valoir la peine d'être édité pour battre la maison que dans 'ostream_iterator (cout,"; ")' dans l'échantillon d'OP, tout ça ';' est en train de mettre un ';' après chaque chaîne lors de la sortie du vecteur. Et comme la sortie a lieu après que la chaîne est divisée, elle ne peut avoir aucun effet sur le découpage. – user4581301