您现在的位置是:首页 > 正文

(三)Boost库之字符串处理

2024-02-01 06:50:41阅读 3

字符串处理一直是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;

转载于:https://my.oschina.net/lingluonianhua/blog/210617

网站文章

  • Elastic:培训视频

    在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考。希望对大家有所帮助。优酷的视频频道地址在这里,B站频道Elastic 简介及Elastic Stack 安装:优酷,腾讯,B站 Elasti...

    2024-02-01 06:50:11
  • 平台级 SAAS 架构的基础:统一身份管理系统

    平台级 SAAS 架构的基础:统一身份管理系统

    为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

    2024-02-01 06:50:04
  • DVWA靶场存储型XSS漏洞实验

    DVWA靶场存储型XSS漏洞实验

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 来自菜鸟的一次简单分享,本次实验主要结合...

    2024-02-01 06:49:56
  • 通过socket通讯控制ur机械臂

    通过socket通讯控制ur机械臂1.socket客户端(连接机械臂)2.控制机械臂运动(发送控制指令)3. 实时 以前一直使用ros跟机械臂打交道,但在使用moveit控制机械臂运动的时候会出现一些...

    2024-02-01 06:49:28
  • 阿里巴巴JarsLink整理

    阿里巴巴JarsLink整理

    一、框架整体类图结构JarsLink整体主要类图二、类功能简介(1)Module类贯彻整个框架,在各个功能中进行传输(2)ModuleLoader接口定义了模块加载的功能,即是将模块加载到新定义的Cl...

    2024-02-01 06:49:20
  • 分布式计算框架

    1、产生背景Web2.0时代,数据爆炸式、指数级增长,大数据分布式计算需求频繁通过单机内存扩展来增强计算能力,已经无法承载大规模数据量的计算分布式计算开发和维护的复杂与多变,对程序员要求太高Googl...

    2024-02-01 06:49:12
  • 第三十八章 立方体贴图和GLSL总结

    第三十八章 立方体贴图和GLSL总结

    2024-02-01 06:49:05
  • Linux 安装Apache 记录

    Linux 安装Apache 记录

    linux下Apache源码编译安装1.下载并安装APR  http://apr.apache.org/wget -c http://mirrors.hust.edu.cn/apache//apr/apr-1.6.2.tar.bz2执行解压命令 tar -xjvf 文件名 解压后切换到目录执行命令配置 :./configure --prefix=/usr/l

    2024-02-01 06:48:35
  • Eclipse RCP入门(创建一个日期选择器)

    直接上代码。 [code=&quot;java&quot;]package org.autumn.rcp.learn; import java.util.Calendar; import java.u...

    2024-02-01 06:47:56
  • C++描述 LeetCode 1004. 最大连续1的个数 III

    C++描述 LeetCode 1004. 最大连续1的个数 III   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中...

    2024-02-01 06:47:50