C/C++ Split 函数字符串切割两个实现

1、此方法与 .NET Framework 提供得字符串切割算法效果不同,它是以明确的 “分割符字符串” 对字符串进行分割。

    int Split(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters) {
        if (str.empty()) {
            return 0;
        }
        else if (delimiters.empty()) {
            tokens.push_back(str);
            return 1;
        }
        size_t last_pos = 0;
        size_t curr_cnt = 0;
        while (true) {
            size_t pos = str.find(delimiters, last_pos);
            if (pos == std::string::npos) {
                pos = str.size();
            }

            size_t len = pos - last_pos;
            if (len != 0) {
                curr_cnt++;
                tokens.push_back(str.substr(last_pos, len));
            }

            if (pos == str.size()) {
                break; 
            } 
            last_pos = pos + delimiters.size();
        }
        return curr_cnt;
    }

2、对满足 “分割字符串任意字符” 进行分割,这才是 .NET Framework 相类似得字符串分割实现,但其效率会低于 “按分割字符串” 进行分割,但好用才是王道,如果严重容不下沙子,那别用分割字符串的代码实现了,每个想要分割时单独写,带上寄存器+内联汇编做极致得优化。

    int Tokenize(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters) {
        if (str.empty()) {
            return 0;
        }
        else if (delimiters.empty()) {
            tokens.push_back(str);
            return 1;
        }

        char* deli_ptr    = (char*)delimiters.data();
        char* deli_endptr = deli_ptr + delimiters.size();
        char* data_ptr    = (char*)str.data();
        char* data_endptr = data_ptr + str.size();
        char* last_ptr    = NULL;

        int length        = 0;
        int seg           = 0;
        while (data_ptr < data_endptr) {
            int ch = *data_ptr;
            int b = 0;
            for (char* p = deli_ptr; p < deli_endptr; p++) {
                if (*p == ch) {
                    b = 1;
                    break;
                }
            }
            if (b) {
                if (seg) {
                    int sz = data_ptr - last_ptr;
                    if (sz > 0) {
                        length++;
                        tokens.push_back(std::string(last_ptr, sz));
                    }
                    seg = 0;
                }
            }
            else if (!seg) {
                seg = 1;
                last_ptr = data_ptr;
            }
            data_ptr++;
        }
        if ((seg && last_ptr) && last_ptr < data_ptr) {
            length++;
            tokens.push_back(std::string(last_ptr, data_ptr - last_ptr));
        }
        return length;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值