Boost String Algorithms Library 是很有用的一个库,它让C++程序员不用一次又一次的为了字符串的处理制造一些小小的轮子。《浅尝boost之String algorithms library》里我主要介绍了它的Split ,因为这个功能很出彩,其它则一带而过。不过,当多次向朋友推荐这个库后,反馈得到的信息让我觉得详细列出其每一个函数的使用,作为一个程序员处理字符串时的手册,是件更有意义的事情。这里我将根据http://www.boost.org/doc/html/string_algo/quickref.html列表顺序,逐一用实例详细的说明每一个函数的使用,希望给自己给同道带来方便。
Table 11.1. Case Conversion
Algorithm name | Description | Functions |
---|---|---|
to_upper | Convert a string to upper case | to_upper_copy() to_upper() |
to_lower | Convert a string to lower case | to_lower_copy() to_lower() |
基础示例:
1 // _copy
2 string str1 = "AABBccdd";
3 assert(to_lower_copy(str1) == "aabbccdd" && str1=="AABBccdd");
4 assert(to_upper_copy(str1) == "AABBCCDD" && str1=="AABBccdd");
5 //
6 string str2 = str1;
7 to_lower(str2);
8 assert(str2 == "aabbccdd");
9 str2 = str1;
10 to_upper(str2);
11 assert(str2 == "AABBCCDD");
2 string str1 = "AABBccdd";
3 assert(to_lower_copy(str1) == "aabbccdd" && str1=="AABBccdd");
4 assert(to_upper_copy(str1) == "AABBCCDD" && str1=="AABBccdd");
5 //
6 string str2 = str1;
7 to_lower(str2);
8 assert(str2 == "aabbccdd");
9 str2 = str1;
10 to_upper(str2);
11 assert(str2 == "AABBCCDD");
注意:带_copy后缀的函数与不带_copy后缀的函数的区别,带_copy的函数不会修改源字符串,而是返回一个转换后的新字符串。
Table 11.2. Trimming
Algorithm name | Description | Functions |
---|---|---|
trim_left | Remove leading spaces from a string | trim_left_copy_if() |
trim_right | Remove trailing spaces from a string | trim_right_copy_if() |
trim | Remove leading and trailing spaces from a string | trim_copy_if()trim_if() |
基础示例:
1 // _copy_if
2 string str1(" space ");
3 assert(trim_left_copy_if(str1, is_space()) == "space ");
4 assert(trim_right_copy_if(str1, is_space()) == " space");
5 assert(trim_copy_if(str1, is_space()) == "space");
6 // _copy
7 assert(trim_left_copy(str1) == "space ");
8 assert(trim_right_copy(str1) == " space");
9 assert(trim_copy(str1) == "space");
10 // _if
11 string str2 = str1;
12 trim_left_if(str2, is_space());
13 assert(str2 == "space ");
14 str2 = str1;
15 trim_right_if(str2, is_space());
16 assert(str2 == " space");
17 str2 = str1;
18 trim_if(str2, is_space());
19 assert(str2 == "space");
20 //
21 str2 = str1;
22 trim_left(str2);
23 assert(str2 == "space ");
24 str2 = str1;
25 trim_right(str2);
26 assert(str2 == " space");
27 str2 = str1;
28 trim(str2);
29 assert(str2 == "space");
2 string str1(" space ");
3 assert(trim_left_copy_if(str1, is_space()) == "space ");
4 assert(trim_right_copy_if(str1, is_space()) == " space");
5 assert(trim_copy_if(str1, is_space()) == "space");
6 // _copy
7 assert(trim_left_copy(str1) == "space ");
8 assert(trim_right_copy(str1) == " space");
9 assert(trim_copy(str1) == "space");
10 // _if
11 string str2 = str1;
12 trim_left_if(str2, is_space());
13 assert(str2 == "space ");
14 str2 = str1;
15 trim_right_if(str2, is_space());
16 assert(str2 == " space");
17 str2 = str1;
18 trim_if(str2, is_space());
19 assert(str2 == "space");
20 //
21 str2 = str1;
22 trim_left(str2);
23 assert(str2 == "space ");
24 str2 = str1;
25 trim_right(str2);
26 assert(str2 == " space");
27 str2 = str1;
28 trim(str2);
29 assert(str2 == "space");
高级示例:
1 //is_any_of() 非常重要的用法,可对付大部分的实际应用
2 string str3("123other");
3 assert(trim_left_copy_if(str3, is_any_of("321")) == "other");
4 //std::back_inserter
5 string str;
6 trim_left_copy_if(std::back_inserter(str), str1, is_space());
7 assert(str == "space ");
8 //is_classified()
9 assert(trim_copy_if(str3, is_classified(std::ctype_base::digit)) == "other");
10 //应用其它的 is_xxxxx方法
11 assert(trim_copy_if(str3, is_digit()) == "other");
12 //通过bind2nd,使用greater, less, less_equal等方法
13 string str4("acdxxxx");
14 assert(trim_left_copy_if(str4, bind2nd(less<char>(),'d')) == "dxxxx");
2 string str3("123other");
3 assert(trim_left_copy_if(str3, is_any_of("321")) == "other");
4 //std::back_inserter
5 string str;
6 trim_left_copy_if(std::back_inserter(str), str1, is_space());
7 assert(str == "space ");
8 //is_classified()
9 assert(trim_copy_if(str3, is_classified(std::ctype_base::digit)) == "other");
10 //应用其它的 is_xxxxx方法
11 assert(trim_copy_if(str3, is_digit()) == "other");
12 //通过bind2nd,使用greater, less, less_equal等方法
13 string str4("acdxxxx");
14 assert(trim_left_copy_if(str4, bind2nd(less<char>(),'d')) == "dxxxx");