C++ Boost库:字符串算法string_algo


C++ Boost库:简介和第一个示例程序
C++ Boost库:数值转换 lexical_cast
C++ Boost库:字符串格式化 format
C++ Boost库:字符串string_algo
C++ Boost库:字符串算法string_algo
C++ Boost库:类型推导BOOST_AUTO/BOOST_TYPEOF
C++ Boost库:分词处理库 tokenizer
C++ Boost库:windows下编译Boost库
C++ Boost库:日期时间库 date_time
C++ Boost库:智能指针scoped_ptr
C++ Boost库:数组智能指针 scoped_array
C++ Boost库:共享所有权的智能指针 shared_ptr
C++ Boost库:工厂函数 make_shared
C++ Boost库:共享有权的数组智能指针shared_array
C++ Boost库:弱引用智能指针 weak_ptr
C++ Boost库:禁止拷贝 nocopyable
C++ Boost库:计时器 timer
C++ Boost库:普通数组array
C++ Boost库:散列容器 unordered_set、unordered_multiset
C++ Boost库:散列容器 unordered_map、unordered_multimap
C++ Boost库:双向映射容器 bimap
C++ Boost库:环形缓冲区 circular_buffer
C++ Boost库:动态多维数组 multi_array
C++ Boost库:使用property_tree解析XML和JSON
C++ Boost库:简化循环 BOOST_FOREACH
C++ Boost库:随机数库 Random
C++ Boost库:引用库 ref
C++ Boost库:绑定库 bind
C++ Boost库:线程库 thread 跨平台多线程
C++ Boost库:互斥量 mutex

1. C/C++处理字符串

C++在标准库中提供了字符串标准类std::string.它提供一些成员函数可以查找子串 find(),替换字符 replace()等基本功能.但是C++处理字符串的能力与其他语言如C#PythonJava比起来;会显得很弱。

string- C++ Reference (cplusplus.com)

2. boost string_algo 字符串大小写转换

booststring_algo库是—个非常全面的字符串算法库,提供了大量字符串操作函数与算法(algorithm),如大小写无关比较,修剪,特定模式的子串查找等,可以再不使用正则表达式的情况下处理大多数字符串相关问题。需包含头文件boost/agorithm/string.hpp

string_algo库提供的算法共分五大类

  • 大小写转换

  • 判断式与分类

  • 修剪

  • 查找与替换

  • 分割与合井

string_algo库中的算法命名遵循了标准库的惯例:

  • **前缀:**有这个前缀表明算法大小写不敏感的;否则大小写敏感

  • **后缀copy:**有这个后缀表明算法不变动输入,返回处理结果的拷贝,否则算法原地处理,输入即输出

  • **后缀if:**有这个后缀表明算法需要一个作为判断式的谓词函数对象,否则使用默认的判断准则

大小写转换:

void to_upper(T &Input);	//大写,改变原字符串
void to_lower(T &Input);	//小写,改变原字符串
T to_upper_copy(T &Input);	//大写,不改变原字符串
T to_lower_copy(T &Input);	//小写,不改变原字符串

示例代码:

#include<iostream>
using namespace  std;

//string_algo库的头文件
#include<boost/algorithm/string.hpp>
using  namespace  boost;//名字空间

int main()
{
   //大小写转换 
   cout << "大小写转换" << endl;
   string  str1 = "abc";
   to_upper(str1);//改变原字符串
   cout << str1 << endl;
  
   to_lower(str1);//改变原字符串
   cout << str1 << endl;
    
   string  str2=to_upper_copy(str1);//不改变原字符串
   cout << str1 << endl;
   cout << str2 << endl;

   return 0;
}

3. boost string_algo 字符串判断式与分类

判断式:

  • starts_with:检测一个字符串是否是另亠个的前缀
  • ends_with:检测、个字符串是否是另一个的后缀
  • contains:检测、个字符串是否被另一个包含
  • equals:检测两个字符串是否相等
  • lexicographical_compare:根据字典序检测一个字符串是否小于另一个
  • all:检测一个字符串中的所有元素是否满足指定的判断式

除了呲所有算法都有另一个i前缀的版本( 忽略大小写

判断式(函数对象):

string_algo增强了标准库中的 equal_to<>和less<>函数对象,允许对不同类型的参数进行比较,并提供大小写无关的形。

  • is_equal:类似 equals算法,比较两个对象是否相等
  • is_less:比较两个对象是否具有小关系
  • is_not_greater:比较两个对象是否具有不大于关系

判断类型:

  • is_space:字符是否为空格
  • is_alnum:字符是否为字母和数字字符
  • is_alpha:字符是否为字母
  • is_cntrl:字符是否为控制字符
  • is_digit:宇符是否为十进制数字
  • is_lower:字符是否为小写字符
  • is_punct:字符是否为标点符号字符
  • is_upper:字符是否为大写字符
  • is_xdigit:字符是否为十六进制数字
  • is_anyof:字符是否是参数字符序列中的任意字符

代码示例:

#include<iostream>
using namespace  std;

//string_algo库的头文件
#include<boost/algorithm/string.hpp>
using  namespace  boost;//名字空间

int main()
{
   //判断式,返回bool
   cout << "判断式" << endl;
   cout << starts_with("Hello World", "He") << endl;//大小写敏感
   cout << starts_with("Hello World", "he") << endl;
   cout << istarts_with("Hello World", "he") << endl;//i忽略大小写

   cout << ends_with("Hello World", "ld") << endl;//大小写敏感 
   cout << iends_with("Hello World", "Ld") << endl;//i忽略大小写

   cout << contains("Hello World", "llo") << endl;//大小写敏感 
   cout << icontains("Hello World", "LLo") << endl;//i忽略大小写

   cout << equals("abc", "abc") << endl;//内容是否相等
   cout << iequals("abc", "Abc") << endl;//内容是否相等,i忽略大小写

   cout << all("Hello", is_lower()) << endl;//判断每一个字符是否全部是小写
   cout << all("hello", is_lower()) << endl;//判断每一个字符是否全部是小写

   cout <<  lexicographical_compare("zabc","xyz")<< endl;//字典次序第一个是否小于第二个

   cout << "判断式,函数对象" << endl;
   cout << is_equal()("abc", "abc") << endl;//内容是否相等,i忽略大小写
   is_equal  eq; 
   cout << eq("abc", "abc")<< endl;//等价于上面的写法

   cout << is_less()("abc", "zbc") << endl;//内容是否小于
   cout << is_not_greater()("abc", "zbc") << endl;//内容是否不大于


   cout << "分类" << endl;
   cout << is_alnum()('1') << endl;//判断是否是字母或数字
   cout << is_alnum()('a') << endl;
   cout << is_alnum()(',') << endl;

   cout << is_alpha()('A') << endl;//是否字母
   cout << is_digit()('1') << endl;//是否数字
   cout << is_cntrl()('\n') << endl;//是否控制字符
   cout << is_any_of("ABCDE")( 'F' ) << endl;//是否是ABCDE里面的任何一个
   cout << is_xdigit()('Q') << endl;//是否16进制的字符
   cout << is_lower()('a') << endl;//是否小写字符

   return 0;
}

4. boost string_algo 字符串修剪

string_algo提供3个修剪算法:

  • trim_copy
  • trim_if
  • trim_copy_if

修剪算法可以删除字符串开发或结尾部分的空格,它有_if_copy两种后缀,因此每个算法有四个版本,_if版本接受一个判断式 IsSpace,将所有被判定为true的字符删除。

示例代码:

#include<iostream>

using namespace std;
#include<boost/algorithm/string.hpp>

using  namespace  boost;

int main()
{
   //修剪(去除左右的空白字符)
   cout << "-------修剪------" << endl;
   string  str = "    Hello    ";
   cout << str << endl;
   trim(str);//直接修改原字符串
   cout << str << endl;

   string  str2 = "    Hello    ";
   cout << trim_copy(str2) << endl;//不修改原字符串
   cout << str2 << endl;

   struct  is_xing//函数对象
   {
   	bool  operator()(const char &c)
   	{
   		return  c == '*';
   	} 
   };
   string str3 = "*****Hello****";
   trim_if(str3, is_xing());
   cout << str3 << endl;

   return 0;
}

5. boost string_algo 字符串查找与替换

string_algo的查找算法提供与std::seach()类似的功能,但接口不太一样,它不是返回一个迭代器(查找到的位置),而使用了 boost.range库的 iterator_range返回查找到的区间。

注:iterator_range,它包装裝了两个迭代器,可以用 begin()end()访问,相当于定义了一个容器的子区间,并可以像原容器一样使用。

查找:

  • find_first:查找子串第一次在被查找串中出现的位置
  • find_last:查找子串最后一次在被查找串中的位置
  • find_nth:查找子串第n次出现在被查找串中的位置
  • find_head:返回字符串头部n个字符串的位置
  • find_tail:返回字符串尾部n个字符串的位置

i前缀表示忽略大小写。

删除/替换:

  • replace/erase_first:替换/删除第一次出现在被查找串中的子串

  • replace/erase_last:替换/删除最后一次出现在被查找串中的子串

  • replace/erase_nth:替换/删除第η次出现在被查找串中的子串

  • replace/erase_all:替换/删除所有的子串

  • replace/erase_head:替换/删除头部几个字符

  • replace/erase_tail:替换/删除尾部几个字符

前四组每个都有前缀i后缀_copy和组合,有四个版本,后两组只有后缀_copy的两个版本。

示例代码:

#include<iostream>
using namespace std;
#include<boost/algorithm/string.hpp>

using  namespace  boost;

int main()
{
   //查找
   cout << "-------查找------" << endl;
   string  str4 = "Hello, hello,hello,Boost!!!";

   iterator_range<string::iterator>  rge;
   rge = find_first(str4, "hello");//查找第一次出现的字符串
   // rge = ifind_first(str4, "hello");
   cout << rge << endl;
   cout << rge.begin() - str4.begin() << "," << rge.end() - str4.begin() << endl;

   rge = find_last(str4, "hello"); //查找最后一次出现的字符串
   cout << rge << endl;
   cout << rge.begin() - str4.begin() << "," << rge.end() - str4.begin() << endl;

   rge = find_nth(str4, "o", 0);//查找第几次出现的字符串
   cout << rge << endl;
   cout << rge.begin() - str4.begin() << "," << rge.end() - str4.begin() << endl;

   rge= find_head(str4, 4);//查找前4个字符
   cout << rge << endl;
   cout << rge.begin() - str4.begin() << "," << rge.end() - str4.begin() << endl;

   //替换、删除
   cout << "-------替换、删除------" << endl;
   string  str5 = "Hello, hello,hello,Boost!!!";

   ireplace_first(str5, "hello", "XXX");//替换第一个,不区分大小写
   cout << str5 << endl;

   replace_all(str5, "hello", "YYY");//替换全部
   cout << str5 << endl;

   erase_last(str5, "YYY");//删除最后一个
   cout << str5 << endl;

   return 0;
}

6. boost string_algo 字符串分割与合并

分割:

string_algo提供了两个字符串分割算法,find_allspilt把字符串分割,并将分割后的字符串复制到摧指定的容器中。

注:要求是必须持有查找结果的的复制或引用,因此容器元素类型是string或者 iterator_range,容器是 vectorlistdeque等标准容器。

合并:

合并算法Join是分割算法spilt的逆运算,把存储在容器中的字符连接成个新的字符串,并且可以指定连接的分隔符。join可带一个if后缀。

示例代码:

#include<iostream>
using namespace std;

#include<boost/algorithm/string.hpp>
#include<boost/typeof/typeof.hpp>
using  namespace  boost;

int main()
{
   //分割字符串
   cout << "分割字符串" << endl;

   string  str = "aaBBccAaxxaa";
   deque<string> v;//标准容器存放结果
   ifind_all(v, str,"aa");
   //for (vector<string>::iterator it = v.begin(); it != v.end(); ++it)
   for(BOOST_AUTO(it, v.begin()); it != v.end(); ++it)
   {
       cout << *it << endl;
   }

   vector< iterator_range<string::iterator>>  v2;
   ifind_all(v2, str, "aa");
   for (BOOST_AUTO(it, v2.begin()); it != v2.end(); ++it)
   {
       cout <<   it->begin()- str.begin()<<","<< it->end() - str.begin() << endl;
   }

   //使用split分割
   string  str2 = "AA*BB*CC-DD";
   list<string> l; 
   split(l, str2, is_any_of("*-")); //分隔符指定为 *或 -
   for (auto e : l)
   {
       cout << e << endl;
   }


   cout << "合并字符串" << endl;

   deque<string>  d;
   d.push_back("stu1");
   d.push_back("stu2");
   d.push_back("tea1");
   d.push_back("tea2");

   string  str3= join(d, "**");
   cout << str3 << endl;

   struct  is_stu
   {
   	bool  operator()(const string &str)
   	{
   		return  starts_with(str, "stu");
   	} 
   };
   string  str4= join_if(d, "**",  is_stu() );
   cout << str4 << endl;

   return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值