zoukankan      html  css  js  c++  java
  • 几种c++字符串split 函数实现的比较

    文中的字符串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] = '';
            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<len;i++)
      v.emplace_back(array[i]);

    }

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

  • 相关阅读:
    Java高并发24-使用自定义锁生成一个消费模型
    Java高并发连载23-基于AQS实现自定义同步器
    JavaScript连载38-编写评论界面
    Java高并发22-AQS条件变量的支持
    Java高并发21-AQS在共享,独占场景下的源码介绍
    SSH 集成Shiro和EhCache,设置登录超时时间无效解决办法。
    Vue3.0 + Echarts 实现地区人口数量分布展示
    从零开始学VUE之网络模块(Axios)
    从零开始学VUE之VueX(modules)
    从零开始学VUE之VueX(actions)
  • 原文地址:https://www.cnblogs.com/qianlicao/p/9274444.html
Copyright © 2011-2022 走看看