美文网首页
几种c++字符串split 函数实现的比较

几种c++字符串split 函数实现的比较

作者: ebayboy | 来源:发表于2019-10-08 17:56 被阅读0次

文中的字符串split函数功能是 从字符串中按照特定的分隔符进行分割,分割的结果保存到std::vector中。

1. strtok实现 

std::vector<std::string> split(const char *s, const char *delim)

{

    std::vector<std::string> result;

    if (s && strlen(s))

    {

        int len = strlen(s);

        char *src = new char[len + 1];

        strcpy(src, s);

        src[len] = '\0';

        char *tokenptr = strtok(src, delim);

        while (tokenptr != NULL)

        {

            std::string tk = tokenptr;

            result.emplace_back(tk);

            tokenptr = strtok(NULL, delim);

        }

        delete[] src;

    }

    return result;

}

2.  优化版的字符串查找方式实现

void supersplit(const std::string& s, std::vector<std::string>& v, const std::string& c)

{

    std::string::size_type pos1, pos2;

    size_t len = s.length();

    pos2 = s.find(c);

    pos1 = 0;

    while(std::string::npos != pos2)

    {

        v.emplace_back(s.substr(pos1, pos2-pos1));

        pos1 = pos2 + c.size();

        pos2 = s.find(c, pos1);

    }

    if(pos1 != len)

        v.emplace_back(s.substr(pos1));

}

3. 正则表达式方式

std::vector<std::string> regexsplit(const std::string& input)

    std::regex re(",");

    std::sregex_token_iterator p(input.begin(), input.end(), re, -1);

    std::sregex_token_iterator end;

    std::vector<std::string> vec;

    while (p != end)

        vec.emplace_back(*p++);

    return vec;

}

4. 使用boost split 实现

std::vector<std::string> boostsplit(const std::string& input)

{

    std::vector <std::string> fields;

    boost::split( fields, input, boost::is_any_of( "," ) );

    return fields;

}

5. sds  sdssplitlen 函数实现

void sdssplit(const std::string& input, std::vector<std::string>& v)

{

int len = 0;

sds* array = sdssplitlen(input.c_str(),input.length(),",",1,&len);

for(int i=0;i

v.emplace_back(array[i]);

}

以上函数用Celero库测试的结果如下:

相关文章

网友评论

      本文标题:几种c++字符串split 函数实现的比较

      本文链接:https://www.haomeiwen.com/subject/hccipctx.html