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
{
};