Boost Library 1.32.0 : String and text processing

本文介绍了Boost库中多个字符串处理相关类。lexical_cast用于字面值转换;format可替代printf进行类型安全的格式化输出;regex需掌握正则语法;spirit是EBNF语法的LL解析器;tokenizer功能强于CRT的strtok;string_algo是一组类的集合,涵盖大小写转换、查找、替换等多种功能。
 网游平台开发中需要使用C++编程,为了有效的利用现有的,成熟的类库,准备对boost库大致浏览一遍,同时将一些心得,记录在blog上。

String and text processing:

1.  conversion/lexical_cast

  lexical_cast类用于字面值的转换,其原型为:

  template<typename Target, typename Source>
  Target lexical_cast(Source arg)

  lexical_cast要求Target支持>>操作,Source支持<<操作,依赖于对stringstream的<<与>>操作完成转换。相对于CRT (C Run-Time Library)中的atoi, atol, atof, lexical_cast支持的数据类型转换更灵活,但运行效率没有进行测试,需要测试后确定是否保留对atoi等的使用。

  无法完成转换时,lexical_cast抛出bad_lexical_cast异常,bad_lexical_cast派生自std::bad_cast

2.  format

  format类用于C++中替代printf like的格式化输出,并且format类是类型安全的。c++中,通过manipulator也可以实现一部分简单的格式化,但是十分有限。
  

  format类在构造时需要指定一个format string,如下:

  format f("%1 + %2 = %3")

  %1代表第一个格式化参数,如果想显示%,那需要用%%来代替。格式化参数并不需要按顺序添加,而且同一个格式化参数也不限于只出现在一处,比如format string可以是"%3 %1 %2 %1"

  format类重载了operator %,比如前面构造的f,可以使用 f % 10 % 20 % 30; 或者 f %10; f % 20; f % 30; 接下来可以使用 << 操作符将 f 输出,或者是 string s = f.str();

  format支持更为复杂的格式化需求,格式为: %[N$][flags][width][.precision]type-char,比如: %3$0#6x

  format类提供了两个方法用于异常处理,分别是:

  unsigned char exceptions(unsigned char newexcept); // query and set exceptions you care
  unsigned char exceptions() const;                             // just query

  exception中可以指定以下的位:

  boost::io::bad_format_string_bit, boost::io::too_few_args_bit, boost::io::too_many_args_bit, boost::io::out_of_range_bit

  另外, boost::io::all_error_bits和boost::io::no_error_bits为别为两个方便全设或清空所有error bit的值。

3.  regex

  regex类就不多记了,需要的时候用就是了,关键是regular expression的语法要记熟。

4.  spirit

  spirit类是 EBNF语法的LL解析器,估计这次不会用到。

5.  tokenizer

  tokenizer是代替CRT中的strtok方法的,并且功能更加强大。tokenizer还提供了interator,方便与其他库的配合应用。

  tokenizer的原型为:

  template <
    class TokenizerFunc = char_delimiters_separator<char>,
    class Iterator = std::string::const_iterator,
    class Type = std::string
>

  boost库中提供了四个预定义的separator: char_separator, escaped_list_separator, offset_separator和char_delimiters_separator,其中最后一个最boost的文档标注为 deprecated

6. string_algo

  与前面的几个类不同,string_algo是一组类的总称,相当于一个sub library了。其位置在boost/algorithm/string目录下,包含的主要内容如下:

  • case_conv.hpp:  大小写转换,包含 to_lower_copy, to_lower, to_upper_copy, to_upper
  • classification.hpp: 字符类别,包含 is_classified(std::ctype_base::mask, locale), is_space, is_alnum, is_upper, is_xdigit等方法
  • cllection_traits.hpp: 一大堆traits类,用于统一char的各种集合类,比如 STL collections, c-style array, null-terminated c-strings等的编程接口。
  • compare.hpp: 字符串字符的functor,提供了is_equal, is_iequal两个predicates.
  • concept.hpp: concept定义,包含FinderConcept和FormatterConcept
  • constants.hpp: 定义了一个enum token_compress_mode_type
  • erase.hpp: 提供了一组从string中移除字符和子串的方法,什么样的都有。
  • find.hpp: 提供了一组从string中寻找子串的方法,允许指定各种寻找子串的条作。
  • finder.hpp:  定义了一组生成string finder的方法
  • formatter.hpp: 定义了一组生成string formatter的方法
  • predicate.hpp: 提供了一组predictate, 包含starts_with, ends_withs, contains等
  • replace.hpp: 提供了一组从string中替换子串的方法
  • split:hpp: 提供了一组分割子串的方法。
  • trim.hpp: trim算法。
### boost::string 和 std::string 的比较 #### 功能差异 `std::string` 是 C++ 标准库中的字符串类,提供了基本的字符串操作功能。而 `boost::string` 实际上并不存在于 Boost 库中;Boost 提供的是更丰富的字符串处理工具集,比如 `boost::algorithm::string` 或者通过 `boost::lexical_cast` 进行类型转换等功能[^1]。 对于实际存在的 `std::string` 而言,在现代 C++ 中已经非常强大和完善,能够满足大多数应用场景下的需求。然而当涉及到更为复杂的字符串算法时,则可能需要借助像 Boost 这样的第三方库来简化编程工作量以及提高代码可读性和维护性[^2]。 #### 性能对比 关于性能方面,通常情况下两者不会有太大差距,因为很多高效的实现细节已经被移植到了标准库当中。但是由于 `std::string` 需要兼容多种平台和编译器版本,所以在某些特定环境下可能会存在一些额外开销。相比之下,Boost 可以针对不同场景提供更加优化的选择[^3]。 #### 使用便利度 从易用性的角度来看,`std::string` 更加直观简单,适合初学者快速上手。而对于熟悉 STL 设计理念的人来说,其接口设计也十分友好。另一方面,虽然 Boost 提供了许多有用的功能模块,但对于不熟悉的开发者来说学习成本较高,并且项目依赖关系复杂可能导致构建过程变得繁琐[^4]。 ```cpp #include <iostream> #include <string> // 假设这里引入了合适的 Boost 头文件用于演示目的 // #include <boost/some_string_header.hpp> int main() { // 创建两个相同内容但不同类型(假设存在 boost::string 类型)的对象 std::string s_std = "Hello"; // boost::string s_boost = "World"; // 此处仅为示意 // 输出它们的内容 std::cout << "Standard String: " << s_std /*<< ", Boost String: " << s_boost*/ << '\n'; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值