迭代器模式

C++ stl引入的迭代器模式,除了本身为stl容器的操作提供了统一的接口,方便stl泛型算法以统一的方式操作所有stl容器外,

在其它所有涉及遍历数据的应用地方,都有它的用武之地,下面列举几个我自己按迭代器模式封装的几个工具类,抛砖引玉。

一、迭代分割的子串

class CStrtok
{
public:

    //构造函数,接收参数
    CStrtok (char *pcSource, const char * pcSep){
        m_pcSep = pcSep;
        m_pcCur = strtok_s(pcSource, pcSep, &m_pcContext);
    }

    //判断是否有下一个子字符串
    bool hasMore() const {
        return m_pcCur != NULL;
    }

    //返回下一个子字符串
    const char * next() {
        const char *pcNext = m_pcCur;
        m_pcCur = strtok_s(NULL, m_pcSep, &m_pcContext);
        return pcNext;
    }

private:
    char * m_pcCur;
    const char * m_pcSep;
    char * m_pcContext;
};

以下是测试代码:

int main()
{
    char szConf[32] = "idlist=(11,112,221)";
    CStrtok parse(szConf, "=)(,");
    if (parse.hasMore())
    {
        printf ("conf name: %s \n", parse.next());
    }
    while (parse.hasMore())
    {
        printf ("conf value: %s \n", parse.next());
    }

    return 0;
}

输出结果:

conf name: idlist
conf value: 11
conf value: 112
conf value: 221
请按任意键继续. . .

由于只能迭代一次,因此CStrtok是一次性迭代器


二、网络报文的分包和组包

由于tcp连接是底层是按块发送的,经过网络还可能会被分包处理,因此需要通信两端进行分包或组包

这个场景也非常适合使用迭代器模式

SendBuff类用于组包发送,大概的思路就是通过SendBuff,将多个小的报文合并到一个大报文里发送

通常对于tcp连接,我们使用8K数据作为一个包长度的上限来发送是比较合适的

class SendBuff

{

};

点赞