字符串算法(string_algorithm) (2)

用法示例

string str("Power Bomb"); assert(iends_with(str,"bomb")); //大小写无关检测后缀 assert(!ends_with(str,"bomb")); //大小写敏感检测后缀 assert(starts_with(str,"Pow")); //检测前缀 assert(contains(str,"er")); //测试包含关系 string str2 = to_lower_copy(str); //转换成小写 assert(iequals(str,str2)); //大小写无关判断相等 assert(ilexicographical_compare(str,str3)); //大小写无关字符串比较 assert(all(str2.substr(0,5),is_lower())); //检测字符串均小写 分类

提供一组分类函数,用于检测字符串是否符合某种特性,主要搭配其他算法使用,如上一节的all

is_space:字符是否为空格或制表符(tab)

is_alnum:字符是否为字母和数字字符

is_alpha:字符是否为字母

is_cntrl:字符是否为控制字符

is_digit:字符是否为十进制数字

is_graph:字符是否为图形字符

is_lower:字符是否为小写字符

is_print:字符是否为可打印字符

is_punct:字符是否为标点符号字符

is_upper:字符是否为大写字符

is_xdigit:字符是否为十六进制数字

is_any_of:字符是否是参数字符序列中的任意字符

if_from_range:字符是否位于指定区间内,即from<=ch<=to

需要注意的是这些函数并不真正地检测字符,而是返回一个类型为detail::is_classifiedF的函数对象,这个函数对象的operator()才是真正的分类函数(因此,这些函数都属于工厂函数)。

修剪

提供三个算法,删去字符串开头结尾的空格,提供_copy后缀和_if后缀

trim_left:删除左边的空格

trim_right:删除右边的空格

trim:删除两边的空格

用法示例

format fmt("|%s|\n"); string str = " samus aran "; cout << fmt % trim_copy(str); //删除两端的空格 cout << fmt % trim_left_copy(str); //删除左边的空格 trim_right(str); //原地删除 cout << fmt % str; string str2 = "2020 Happy new Year!!!"; cout << fmt % trim_left_copy_if(str2,is_digit()); //删除左端的数字 cout << fmt % trim_right_copy_if(str2,is_punct()); //删除右边的标点 //删除两端的标点、数字和空格 cout << fmt % trim_copy_if(str2,is_punct() || is_digit() || is_space());

执行结果

|samus aran| |samus aran | | samus aran| | Happy new Year!!!| |2020 Happy new Year| |Happy new Year| 查找

提供的查找算法如下:

find_first:查找字符串在输入中第一次出现的位置

find_last:查找字符串在输入中最后一次出现的位置

find_nth:查找字符串在输入中的第N次(从0开始计数)出现的位置

find_head:取一个字符串开头N个字符的子串,相当于substr(0,n)

find_tail:取一个字符串末尾N个字符的子串

【注意事项】

这些算法的返回值是iterator_range,在概念上类似于std::pair,包装了两个迭代器,可以用begin()和end()访问。提供了i前缀的用法。
用法示例

format fmt("|%s|.pos = %d\n"); string str = "Long long ago , there was a king."; iterator_range<string::iterator> rge; //迭代器区间 rge = find_first(str,"long"); //找第一次出现 cout << fmt % rge % (rge.begin() - str.begin()); rge = ifind_first(str,"long"); //大小写无关第一次出现 cout << fmt % rge % (rge.begin() - str.begin()); rge = find_nth(str,"ng",2); //找第三次出现 cout << fmt % rge % (rge.begin() - str.begin()); rge = find_head(str,4); //取前4个字符 cout << fmt % rge % (rge.begin() - str.begin()); rge = find_tail(str,5); //取末5个字符 cout << fmt % rge % (rge.begin() - str.begin()); rge = find_first(str,"samus"); //找不到 assert(rge.empty() && !rge);

执行结果

|long|.pos = 5 |Long|.pos = 0 |ng|.pos = 30 |Long|.pos = 0 |king.|.pos = 28 替换与删除

替换、删除操作与查找算法非常接近,是在查找到结果后再对字符串进行处理,具体如下:

replace/erase_first:替换/删除字符串在输入中的第一次出现

replace/erase_last:替换/删除字符串在输入中的最后一次出现

replace/erase_nth:替换/删除字符串在输入中的第n次出现

replace/erase_all:替换/删除字符串在输入中的所有出现

replace/erase_head:替换/删除输入的开头

replace/erase_tail:替换/删除输入的末尾

前8个算法每个都有前缀i、后缀_copy的组合,有四个版本,后4个则只有后缀_copy的两个版本

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxpy.html