谁能解释这个C ++函数split_string()?

时间:2019-07-13 11:14:49

标签: c++

vector<string> split_string(string input_string) {
    string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) {
        return x == y and x == ' ';
    });

    input_string.erase(new_end, input_string.end());

    while (input_string[input_string.length() - 1] == ' ') {
        input_string.pop_back();
    }

    vector<string> splits;
    char delimiter = ' ';

    size_t i = 0;
    size_t pos = input_string.find(delimiter);

    while (pos != string::npos) {
        splits.push_back(input_string.substr(i, pos - i));

        i = pos + 1;
        pos = input_string.find(delimiter, i);
    }

    splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));

    return splits;
}

1 个答案:

答案 0 :(得分:0)

哇。如此简单的任务需要很多行代码。

该函数应将字符串拆分为子字符串。脱脂剂是一个空间。

前两个或更多空格应消除。使用std::unique。然后尾随空格将被循环删除。我看不到前导空格会被消除。

之后,用std::find搜索定界符(空格)。然后将子字符串a复制到向量中。

请注意,所有这些操作都可以使用单线完成。甚至不需要任何子功能。解决方案是使用“ std :: regex”定义要查找的内容。然后在向量的范围构造函数中使用sregex_token_iterator

请参阅:

#include <iostream>
#include <string>
#include <regex>
#include <vector>

// Define, what we want to find. In this case: Characters, Digits and _. Or, whatever you want to have
const std::regex regexForWord("([\\w\\d_]+)");


int main()
{
    std::string test("   Hello,,,World.:  Hello ... World1      ");

    // Define variable vector and fill it
    std::vector<std::string> words{ std::sregex_token_iterator(test.begin(), test.end(), regexForWord, 1), std::sregex_token_iterator() };

    // Display output
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}