• 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"
    
  • 相关阅读:
    ZOJ 3631 Watashi's BG(dp+dfs)
    hdu 1506 Largest Rectangle in a Histogram(单调栈)
    csu 1392 Number Trick (数论)
    ACM 奋斗的小蜗牛
    ACM 16进制的简单运算
    ACM 交换输出
    ACM Longest Repeated Sequence
    ACM Arithmetic Expression
    ACM 素数
    ACM 无线网络覆盖
  • 原文地址:https://www.cnblogs.com/outxiao/p/13614619.html
Copyright © 2020-2023  润新知