我的文章追求简单实用,旨在知识共享。
介绍对象:boost/tokenizer
用处:你要处理的字符串很长,又要从中取很多的值的时候,用这玩意儿太省事了。当然,其他情况只要你想去“切”一个字符串,它就包准能派上用场。
处理过程,设计架构:
1. 通过指定的界定符把要处理的字符串“切成小段”,界定符是一个模板类,你要按什么“切”,它就变成什么刀;
2. 把切好的小段再装到一个容器里,这好像看起来是个普通的容器,操作跟别的都一样;
3. 接下来就该干嘛干嘛了。自己去容器里边找你要的信息,切好的小段字符串都按顺序放在里边了。
一个例子让你上手:
我的“刀”: =:{}\n
切完后容器里的数据: router, tteerc, tt, dd, link, yathedfda, type, 12.
代码:
#include <iostream>
#include <boost/tokenizer.hpp> //这就是tokenizer的头文件,包含它就能用啦!挺好记的!
using namespace std;
using namespace boost;
int main()
{
string lines = "router=tteerc:tt :=dd link: {yathedfda} type=12\n"; //要处理的字符串
const char* const dropped_delimiters = ":= \n,{}" ; // 这是定义以哪些字符来进行分割,遇上这些字符就来一刀
char_separator<char> separator( dropped_delimiters) ; //我决定用上一行指定的字符来切,所以就用char_separator<char>,你可以想成这就是“字符刀”
tokenizer< char_separator<char> > toker( lines, separator ) ; //开切,切完装toker里边
//下边开始就是对toker的历遍了,操作跟普通容器一样
tokenizer_type::iterator beg = toker.begin();
for(; beg != toker.end(); beg++)
{
std::cout<<*beg<<std::endl;
}
return 0;
}
程序结果输出:
router
tteerc
tt
dd
link
yathedfda
type
12
值都在容器里就好办了,比如我要取type的值12,那就找到type:if(*beg == "type") , 取12:*++beg
到此,相信你对这个工具有所了解了吧。
刚才说到“字符刀”,tokenizer又是个模板类,你一定会想到还有其他“刀”,还有其他方法来切字符串。不要急,我的下一篇文章——提高篇就告诉更多tokenizer的东西。
希望此文对你有帮助。