文章目录
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#
、Python
、Java
比起来;会显得很弱。
string- C++ Reference (cplusplus.com)
2. boost string_algo 字符串大小写转换
boost
的 string_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_all
和spilt
把字符串分割,并将分割后的字符串复制到摧指定的容器中。
注:要求是必须持有查找结果的的复制或引用,因此容器元素类型是string
或者 iterator_range
,容器是 vector
,list
,deque
等标准容器。
合并:
合并算法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;
}