【问题标题】:Splitting std::wstring into std::vector将 std::wstring 拆分为 std::vector
【发布时间】:2016-08-17 03:58:01
【问题描述】:

此问题展示了如何使用 单个 字符分隔符将 string 拆分为 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&lt;wstring, wchar_t&gt; 会导致iterator.h 中的编译错误。

如何将std::wstring 拆分为由";" 分隔的std::vector

【问题讨论】:

    标签: c++ string vector wstring


    【解决方案1】:

    您将无法在示例中使用该方法。该方法依赖于输入是空格分隔的。在你的问题中,你说你的字符串是;,像"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 有两个不同的特化 charwchar_t 并且具有不同的功能。您不能只用 ctype&lt;wchar_t&gt; 更改所有出现的 ctype&lt;char&gt; 并完成,因为 ctype&lt;wchar_t&gt; 缺少第二个示例使用的函数

    【讨论】:

    • 此方法适用于std::string,使用“;”尽管。所以它只使用空格是不正确的。但我现在就试试你的例子。
    • @bytecode77 您在示例中显示的代码没有使用可以根据其他字符进行拆分的第二种方法。如果您使用的是该版本,那么您应该更新您的示例。
    • 可能值得编辑以击败 OP 样本中 ostream_iterator&lt;wstring&gt;(cout, ";") 中的所有内容 ';'正在做的是放一个';'输出向量时在每个字符串之后。而且由于输出发生在字符串被分割之后,它不会对分割产生任何影响。
    • @bytecode77 没问题。我刚刚在我的答案中添加了一个简介,为什么链接到问题中的第二个示例不适用于wchar_t。如果他知道用宽字符和字符串执行此操作的方法,您可能希望作为回答者。
    • 还有一件事:会不会是getline() 在字符串的末尾添加了一些东西,比如'\n' 或'\0'?我注意到进一步的代码错误地处理了这个字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2021-07-12
    • 2016-03-31
    相关资源
    最近更新 更多