2016-04-23 5 views
6

Этот вопрос показывает, как разделить string на vector с использованием односимвольного деликатного .Разбиение std :: wstring в std :: vector

Вопрос:Right way to split an std::string into a vector

Однако, применяя эту технику wstring не так просто, как я думал. Поэтому это, безусловно, не дубликат.

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

Вторая строка не может быть составлен с использованием VS2015. И использование istream_iterator<wstring, wchar_t> вызывает ошибку компиляции в iterator.h.

Как я могу разделить std::wstring в std::vector, которая отделена от ";"?

ответ

6

Вы не сможете использовать метод в своем примере. Этот метод основан на том, что вход является свободным пространством. В вашем вопросе вы говорите, что ваши строки a ; разделены, как "the;quick;brown;fox". Для этого вы можете использовать std:getline с ';' в качестве разделителя для разрыва строки.

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

Вышеприведенные загружает строку в поток, а затем будет продолжать называть std::getline ломку в ';'-х до тех пор, пока не достигнет конца потока.

Я хотел бы также отметить, что если бы ваш второй пример разделить данные, которые вы не видели его как

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

поместит «;» прямо в строку. Он также нуждается в std::wcout вместо std::cout, поскольку вы имеете дело с широкими персонажами.

Согласно cppreference ctype имеет две различные специализации для char и wchar_t и имеют разные функции. Вы не можете просто изменить все события ctype<char> с ctype<wchar_t> и сделать это как ctype<wchar_t> отсутствует функции, которые используются во втором примере

+0

Этот метод работает на 'std :: string', используя«; » хоть. Поэтому он работает только с пробелом. Но я попробую ваш пример прямо сейчас. – bytecode77

+0

@ bytecode77 Код, который вы показываете в своем примере, не использует второй метод, который может разбиваться на другие символы. Если вы используете эту версию, вам следует обновить свой пример. – NathanOliver

+0

Возможно, стоит изменить, чтобы избить дом, что в 'ostream_iterator (cout,"; ")' в образце OP, все это ';' делает, ставит ';' после каждой строки при выводе вектора. И это потому, что вывод происходит после того, как строка разделена, она не может повлиять на расщепление. – user4581301

Смежные вопросы