zoukankan      html  css  js  c++  java
  • Redis设计与实现书中勘误-sdstrim函数解释错误

    Redis 3.0 unstable 版本中,《Redis设计与实现》作者在书中写到

    使用sdstrim函数后,sds字符串变为

    源码中C的实现为

    sds sdstrim(sds s, const char *cset) {
        struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
        char *start, *end, *sp, *ep;
        size_t len;
        // 设置和记录指针
        sp = start = s;
        ep = end = s+sdslen(s)-1;
        // 修剪, T = O(N^2)
        while(sp <= end && strchr(cset, *sp))
            sp++;
        while(ep > start && strchr(cset, *ep))
            ep--;
        // 计算 trim 完毕之后剩余的字符串长度
        len = (sp > ep) ? 0 : ((ep-sp)+1);
        // 如果有需要,前移字符串内容
        // T = O(N)
        if (sh->buf != sp) memmove(sh->buf, sp, len);
        // 添加终结符
        sh->buf[len] = '';
        // 更新属性
        sh->free = sh->free+(sh->len-len);
        sh->len = len;
        // 返回修剪后的 sds
        return s;
    }
    

    其中,trim主要使用两个指针,sp和ep(开始指针和结束指针),由两个while控制

    while(sp <= end && strchr(cset, *sp))
            sp++;
        while(ep > start && strchr(cset, *ep))
            ep--;
    

    这两个while只是将被修剪字符串的两边进行修剪,而碰到非修剪集合的字符指针不会移动。例如:

    字符串:"XXXXYYXBXXXBXXXYYY" ,修剪集合 "XY"
    修剪结果 "为BXXXB", 而不是"BB"
    
  • 相关阅读:
    Spring set注入
    Spring 搭建
    MyBatis 动态Sql
    Mybatis 数据读取
    MyBatis 搭建
    第三十二章:Map集合
    第三十一章:集合输出
    第三十章:Set集合
    第二十八、九章:类集框架简介、List集合
    第25、26、27章:类加载器、反射与代理设计模式、反射与Annotation
  • 原文地址:https://www.cnblogs.com/outxiao/p/13614619.html
Copyright © 2011-2022 走看看