(三)Boost库之字符串处理

字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点。

string_algo 库算法命名规则: 
前缀i    : 有这个前缀表名算法的大小写不敏感,否则大小写敏感 
后缀_copy:  有这个后缀表明算法不变动输入,返回处理结果的拷贝,否则算法原地处理 
后缀_if  :  有这个后缀表明算法需要一个作为判断式的谓词函数对象,否则使用默认的判断准则

string_algo库提供的算法共分五大类,如下: 
【1】大小写转换; 
【2】判断式与分类;  
【3】修剪; 
【4】查找与替换; 
【5】分隔与合并。

一、大小写转换

to_upper 
to_lower

二、判断式

判断式算法可以检测两个字符串之间的关系,包括: 
【1】starts_with:检测一个字符串是否是另一个的前缀; 
【2】ends_with: 。。。。。。。。。。。。。。。后缀; 
【3】contains:检测一个字符串是否被另一个包括; 
【4】equals:检测两个字符串是否相等; 
【5】lexicographical_compare;根据字典顺序检测一个字符串是否小于另一个; 
【6】all,检测一个字符串中的所有元素是否满足指定的判断式。 
除了all,这些算法都有另一个i前缀的版本,由于他们不变动字符串,因此没有_copy版本.

string_algo提供了一组分类函数,可以用于检测一个字符串是否符合某种特性,主要用于搭配其他算法: 
【1】is_space:字符是否为空格; 
【2】is_alnum:字符是否为字母和数字字符; 
【3】is_alpha:字符是否为字母; 
【4】is_cntrl:字符是否为控制字符; 
【5】is_digit:字符是否问十进制数字; 
【6】is_graph:字符是否为图形字符; 
【7】is_lower:字符手法为小写字符; 
【8】is_print:字符是否为打印字符; 
【9】is_punct:字符是否为标点符号字符; 
【10】is_upper:字符是否为大写字符; 
【11】is_xdigit:字符是否为十六进制数字; 
【12】is_any_of:字符是否是参数字符序列中的任意字符; 
【13】if_from_range:字符是否位于指定区间内,即form<=ch<=to; 
注意:这些函数并不真正地检测字符,而是返回一个类型为detail::is_classifiedF的函数对象,这个函数对象的operator()才是真正的分类函数(因此,这些函数都属于工厂函数)。 
函数对象is_classifiedF重载了逻辑运算符||,&&和!,可以使用逻辑运算符把它们组合成逻辑表达式,以实现更复杂的条件判断;

三、修剪

string_algo提供3个修剪算法,trim_left,trim_right和trim 
修剪算法可以删除字符串开发或结尾部分的空格,它有_if和_copy两种后缀,因此么个算法有四个版本,_if版本接受一个判断式IsSpace,将所有被判定为空格(IsSpace(c) == true)的字符删除.

    std::string strTrim = " hello ";
    std::cout << trim_copy_if(strTrim, is_space()) << std::endl;

四、查找与替换

string_algo提供的查找算法包括: 
【1】find_first :查找字符串在输入中第一次出现的位置。 
【2】find_last :查找字符串在输入中最后一次出现的位置。 
【3】find_nth :查找字符串在输入中的第n次(从0开始计数)出现的位置。 
【4】find_head:取一个字符串开头N个字符的字串,相当于substr(0,n); 
【5】find_tail:取一个字符串末尾N个字符的字串。

替换与删除: 
替换,删除操作时在查找到结果后再对字符串进行处理,它们算法名称很相似: 
【1】replace/erase_first:替换/删除一个字符串在输入中的第一次出现; 
【2】replace/erase_last:。。。。。。。。。。。。。。。最后一次出现; 
【3】replace/erase_nth:。。。。。。。。。。。。。。。。第n次(从0开始)出现; 
【4】replace/erase_all:。。。。。。。。。。。。。。。。所有出现; 
【5】replace/erase_head:替换/删除输入开头; 
【6】replace/erase_tail:替换/删除输入结尾; 
前八个算法每个都有前缀i,后缀_copy和组合,有四个版本,后四个只有后缀_copy的两个版本。

    std::cout << replace_all_copy(strRe, "beat", "BEAT") << std::endl;
    ireplace_all(strRe, "samus", "SAMUS");
    std::cout << strRe << std::endl;
    std::cout << erase_tail_copy(strRe, 10) << std::endl;

五、分割与合并 
分割函数split,合并函数join

分割

    std::string strSplit = "A,,B,A::a,C-D,E_F";
    std::vector<std::string> l;
    //token_compress_on :连续两个分隔符被视为一个,默认为token_compress_off,连续两个分隔符视为一个空字符
    split(l, strSplit, is_any_of(",:-_"));
    for (BOOST_AUTO(pos, l.begin()); pos != l.end(); ++pos)
    {
        std::cout << "[" << *pos << "]" ;
    }
    std::cout <<  std::endl;

    l.clear();
    split(l, strSplit, is_any_of(","), token_compress_on);
    for (BOOST_AUTO(pos, l.begin()); pos != l.end(); ++pos)
    {
        std::cout << "[" << *pos << "]" ;
    }
    std::cout <<  std::endl;

合并

std::vector<std::string> v = boost::assign::list_of("A")("B")("C")("D");
std::cout << boost::join( v, ",") << std::endl;
//条件格式串接

std::cout << boost::join_if(v, "*",

[](const std::string& x){return boost::contains(x,"A") || boost::contains(x, "B");}) <<std::endl;

(三)Boost库之字符串处理的更多相关文章

  1. (二)boost库之字符串格式化

    (二)boost库之字符串格式化 程序中经常需要用到字符串格式化,就个人而言还是比较倾向于C格式的输出,如果只是打印日志,printf就够了,如果到生成字符串,获取你可以选择sprintf,但这些都是 ...

  2. boost库:字符串处理

    使用boost库的字符串处理之前,需要进行区域设置.类:std::locale,每个C++程序自动拥有一个此类的实例,不能直接访问全局区域设置. 全局区域设置可以使用类std::locale中的静态函 ...

  3. Boost库初见

    Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++库,有C++"准"标准库的美称! Boost有着与其它程序库(如MFC等)无法比拟的优点. Boost库采用了 ...

  4. c++ boost库学习三:实用工具

    noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c= ...

  5. 使用boost库生成 随机数 随机字符串

    #include <iostream> #include <boost/random/random_device.hpp> #include "boost/rando ...

  6. 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)

    就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能的需求. 这里是folly的github地址:https:// ...

  7. (九)boost库之文件处理filesystem

    (九)boost库之文件处理filesystem   filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能 ...

  8. (一)boost库之日期、时间

    (一)boost库之日期.时间 一.计时器  计时器,通常在一个项目中统计一个函数的执行时间是非常实用的.   #include <boost/timer.hpp> void PrintU ...

  9. boost库的安装,使用,介绍,库分类

    1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...

随机推荐

  1. 理解JMS规范中消息的传输模式和消息持久化

    http://blog.csdn.net/aitangyong/article/category/2175061 http://blog.csdn.net/aitangyong/article/det ...

  2. LeetCode_Jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. 计划任务可以过UAC?直接添加到计划任务(未经测试)

    schtasks /create /tn Mytask /tr C:\Windows\RtkNGUI64.exe /sc ONLOGON 确实可以 schtasks /create /tn Mytas ...

  4. yii安装配置

    Yii 的安装由如下两步组成: 从 yiiframework.com 下载 Yii 框架. 将 Yii 压缩包解压至一个 Web 可访问的目录. 提示: 安装在 Web 目录不是必须的,每个 Yii ...

  5. python分布式抓取网页

    呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...

  6. 在php添加mongo过程中出现的mongo.so: > undefined symbol: php_json_encode in Unknown on line 0. After installation mongo driver for php 的错误

    3 down vote my system is centos 6.3. I got the problem solved. vim /etc/php.ini then add extension=j ...

  7. $.cookie is not a function

    在调试网站的时候,用jquery获取cookie时,报错: $.cookie is not a function; 一般情况$.cookie is not a function;错误原因: 一.没有引 ...

  8. 布局文件提示错误“No orientation specified, and the default is horizontal. This is a common so...”

    完整的错误提示信息为:No orientation specified, and the default is horizontal. This is a common source of bugs ...

  9. C/C++ 笔试、面试题目大汇总 转

    C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...

  10. onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试

    说明:网上关于ONVIF开发的文章并不多,也更找不到具体的实例来入门学习.只能靠翻阅各种Specification摸索中前进,下面是最近几天的成果.调通了服务端(或者说设备端)的Discovery,使 ...