• 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"
    
  • 相关阅读:
    图解Eclipse中配置Maven并创建Maven的Web工程
    Bzoj1922: [Sdoi2010]大陆争霸
    Bzoj2007: [Noi2010]海拔
    Bzoj5212: [Zjoi2018]历史
    NOIP2017:列队
    NOIP2017:逛公园
    CF908D New Year and Arbitrary Arrangement
    HDU4652:Dice
    HDU4336:Card Collector(min-max容斥)
    [NOI2017]游戏
  • 原文地址:https://www.cnblogs.com/outxiao/p/13614619.html
Copyright © 2020-2023  润新知