zoukankan      html  css  js  c++  java
  • (三)Boost库之字符串处理

    (三)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;

  • 相关阅读:
    css3样式二
    CSS3样式
    css基础样式四
    css样式基础三
    CSS样式基础二
    Css样式基础
    html(二)
    html(一)
    Linux 下 Memcached 缓存服务器安装配置
    java.lang.OutOfMemoryError: Java heap space解决方法
  • 原文地址:https://www.cnblogs.com/timssd/p/5544670.html
Copyright © 2011-2022 走看看