关于宽字符:
wstring 为宽字符,宽字符串需要用L修饰wstring str=L"LMKD"; wcout<<str;//wcout输出宽字符串
1.boost
下载网址:www.boost.org下载boost_1_42_0.7z
需要编译的库有:date_time、regex、program_option、test、thread、python。
STLport:同C98,C11一样,是第三方重新实现的可移植的C++标准库。在DEBUG模式下单独使用stlport需要定义宏"__STL_DEBUG";与boost混合使用需要定义"_STLP_DEBUG";与MFC配合使用需要定义"_STLP_USE_MFC"
STLport下载网址:www.stlport.org
2.时间和日期处理
timer 计算流逝时间
process_timer 析构时自动打印处理时间
process_display 进度条显示
-date days weeks date_period date_iterator time_duration hours minutes seconds millisec ptime(戳) 日期时间处理
3.内存管理
<boost/smart_ptr.hpp>
<boost/pool/pool.h> 依赖boost_system库
智能指针和内存池是二种不同的内存管理机制,都可以有效的主动释放内存。
RAII机制-资源获取即初始化
scoped_ptr 类似与auto_ptr(同一时刻只可能有一个auto_ptr管理对象),不能转移对象管理权,超出作用域时自动析构
scoped_array
shared_ptr shared_array make_shared()使用了引用计数,share_ptr可以让不能拷贝的对象实现拷贝或共享。应用于工厂模型作为返回值,可以有效的管理内存。
enable_share_from_this<T> 使用该类可以实现使用share_ptr<>管理this指针,这样的类最好构建在堆上,否则返回的share_ptr可能无法释放内存。
weak_ptr 用于协助shared_ptr工作,从shared_ptr获得值不会使shared_ptr引用计数增加。
boost的内存池管理包含4个类:(通过内存池,可以构造大量同类型的对象,内存池对象在作用域之外将自动析构,无需smart_ptr管理返回的内存池指针)
a.pool 只能作为int/double等基本对象内存池(因为它不能调用类的析构函数),类似与malloc。
b.object_pool 对象内存池,将内存分配和对象构造分开
c.singleton_pool
d.pool_allocator 内存池分配器,提供内存分配算法,可用于替换标准容器的内存分配算法。
内存池返回的内存块指针在超出作用域时能自动被释放到池中。
share_ptr、内置类型、标准容器库的线程安全:
shared_ptr 本身不是100% 线程安全的。它的引用计数本身是安全且无锁的(原子操作),但对象的读写则不是,因为shared_ptr类中有两个数据成员,读写操作不能原子化。
根据官方文档,shared_ptr的线程安全级别和内建类型、标准库容器、string一样,即:
a.一个shared_ptr 对象实体可被多个线程同时读取;
b.两个shared_ptr 对象实体可以被两个线程同时写入,“析构”算写操作;
c.如果要从多个线程读写同一个shared_ptr 对象,那么需要加锁。
请注意,以上是shared_ptr 对象本身的线程安全级别,不是它管理的对象的线程安全级别。
4.实用工具
<boost/noncopyable.hpp>
<boost/utility.hpp>
<boost/typeof/typeof.hpp>
<boost/typeof.hpp>
<boost/optional.hpp>
<boost/assign.hpp> boost::assign
<boost/logic/tribool.hpp>
<boost/exception/all.hpp>
<boost/uuid/uuid.hpp>
<boost/uuid/uuid_generators.hpp>
<boost/uuid/uuid_io.hpp> boost::uuids
noncopyable 继承该类,实现一个不可复制的类。原理:该类实现了复制和赋值函数的私有化,从而其子类也是不可复制和赋值的。
BOOST_TYPEOF <=>typeof 通常在模版定义中可以避免冗长的类型定义。编译时返回数据的类型 BOOST_TYPEOF(2) i=2 <=>int i=2, typeid()
BOOST_AUTO 自动类型:同BOOST_TYPEOF,根据赋值的右操作数,自动推到类型。BOOST_AUTO(Y,make_pair(1,"string"));推导类型为pair<int,const char*>. BOOST_AUTO(&a,new double[20])推导为double*的引用。
BOOST_TYPEOF_REGISTER_TYPE() 宏,向boost库注册自定义的类。然后该类才能使用自动推导。
optional<int> 三态实现,可以取none值
boost重载了 ’+=‘ ’,‘ ‘()’ 三种操作符。函数list_of(),push_back(),push_front(),insert() 以及.repeat()和range()
assign.hpp 中的 += 赋值 map<int,string> m; m+=make_pare(1,"one"),make_pare(2,"two"),make_pare(3,"three")
assign.hpp 中的关联容器赋值insert(m)(make_pare(1,"one"))(make_pare(2,"two"))(make_pare(3,"three"))
assign.hpp 中的顺序容器赋值list<int>ls; push_front(ls)(1)(2)(3);
assign.hpp 中range迭代器赋值deque<int>d; push_front(d).range(v.begin(),v.begin()+5);
assign.hpp 中的初始化时赋值 list_of,map_list_of/pair_list_of,tuple_list_of. map<int,string> m=list_of(make_pare(1,"one")),make_pare(2,"two"),make_pare(3,"three") ;map<int,string> n=map_list_of(1,"1")(2,"2")(3,"3")
assign.hpp 中repeat减少赋值重复输入 vecttor<int>v=list_of(1).repeat(10,2)(3)(4)(5) 重复10个2
assign.hpp 中repeat_fun通过回调函数来决定重复的值vecttor<int>v=list_of(1).repeat_fun(10,&rand)(3)(4)(5); deque<int> d;push_front(d).rang(v.begin(),v.begin()+5);
assign.hpp 中对容器适配器赋值时需要 to_adapter()转换 stack<int>stk=(list(1),2,3).to_adapter();
swap,fill_n交换与填充:int a1[10];int a2[10];std::fill_n(a1,10,5);std::fill_n(a2,10,5); boost::swap(a1,a2); std::copy()
tribool正宗的三态 true false indeterminate 与optional<bool>的效果差不多
singleton_default<T>单体模版
UUID<->GUID 用于唯一标识一个物品,它保存一个16字节的数组。uuid生成器算法有:nil_generator(),sgen(),name_generator(),string_generator(),random_generator()
BOOST_BINARY(01011010)表示一个二进制常量,bitset<5>(BOOST_BINARY(01101))
__FUNCTION__表示当前函数的函数名字符串;BOOST_CURRENT_FUNCTION当前函数的完全定义申明字符串
5.字符串与文本处理
<boost/lexical_cast.hpp>
<boost/format.hpp>
<boost/algorithm/string.hpp>
lexical<Tto>(From)基本数据类型转化,错误的转化会抛出bad_lexical_cast异常.
num_valid<t>()判断数据是否能转换成有效的T类型数据。
format格式化数据类型转化(支持位置和类型2种):format(%10s %5d)%"lk"%10;format("%1% + %2% *%2% = %3%")%10 %5 %35;
boost/algorithm/string.hpp字符串算法库:该算法库可以处理任何符合boost.range要求的容器。
_copy后缀:表示先产生一份复制,再在复制上进行操作。
_if后缀:表示该表达式可以有一个判断式入参(函数对象)。
i前缀:表示不区分大小写。
大小写转换:to_upper_copy(),to_lower_copy()形成一份字符串拷贝并将该拷贝转化成大小或小写
判断:ends_with(),starts_with(),contains(),equals(),all(),lexicographical_compare()字符串比较
字符算法的判断式(即函数对象):is_equal(),is_less(),is_not_greater(),is_space(),is_alnum(),is_cntrl(),is_digit(),is_lower(),...
替代和删除:replace/erase_first(),replace/erase_last(),replace/erase_nth(),replace/erase_head(),replace/erase_tail().都可以有_copy后缀
修剪:trim_left,trim_right(),trim(),每个都有_copy后缀和_if后缀(_if表示可以有一个判断式的函数对象) trim_left_copy_if(str,is_digit());
查找:find_first(),find_last(),find_nth(),find_head(),find_tail(),find_all()
拆分与合并:split(),joint() (_if)
查找和拆分迭代器:find_iterator,split_iterator
分词(只能以单个字符进行分词):tokenizer分词类 默认以所有标号分词(本身包含一个迭代器,分词很方便)。char_separator<>分隔符类;escapsed_list_separator有转义字符时使用的分隔符类;offset_separator偏移分隔符处理以多个指定任意长度循环分词。
正则:cregex,regex_match()判断是否完全匹配,regex_search()搜索部分匹配结果;regex_replace()匹配后替换;sregex_iterator匹配迭代器;cregex_token_iterator正则分词匹配器(提供迭代模式的分词);
6.正确性测试
<boost/assert.hpp>
assert断言(在release模式下无效)
BOOST_VERIFY校验(在release模式下无效)
...
7.容器与数据结构
<boost/array.hpp>
BOOST的10个常见容器:
array,ref_array(代理一个缓存)
dynamic_bitset与c98的bitset相比,其size可以动态增长。BOOST_BINARY()宏
unordered_map/hash_map unordered_set/hash_set散列容器
bimap 双向映射map
circular_buffer 循环缓冲区
tuple 最大只能保存10种类型的数据,make_tuple()
any 相当于java的object基类,可以容纳任意类型的一个元素 any a(10); m=any_cast<int>(a);
variant 可变类型变量(与any很像),是对union概念的增强和扩展。variant<int,double,string> vat; vat的类型可以是int,double,string中的任意一种。可以通过get<T>(vat)来取值
multi_array 多为数组容器,可以改变每一维上的长度,但是维数不能变
property_tree 属性树很有用,用来解析xml,json,info,ini等配置文件
8.泛型算法
BOOST_AUTO typeof
BOOST_FOREACH 一般支持用迭代器来访问的容器
minmax() 求最大和最小值,返回一个tuple。
minmax_element()求容器的最大最小值
first_min/max_element(), last__min/max_element(),first_min_last_max_element()
9.数学与数字
integer,integer_traits 整数特征类,定义了类型 uint8_t,int_fast16_t,int_least32_t,uintmax_t等整数类型
rational 有理数,支持分数运算,numerator分子denominator分母;rational(20)->1/20;rational(13,20)->13/20
crc 循环冗余校验码 crc_32_type,crc_16_type
random 随机数
10.操作系统相关
system系统相关
filessystem 文件系统相关 path路径和文件处理统一
文件属性:initial_path(),current_path(),file_size(),last_write_time()
文件处理:create_directory(),rename(),remove(),copy_file(),...
迭代目录和文件:directory_iterator类,is_directory()
program_options命令行选项
11.函数与回调
result_of 可以自动推导函数的返回值类型 typedef double (*Func)(int d); Func func=sqrt;result_of<Func(double)>::type x=func(5.0);
ref() cref(常引用) 返回对象的引用,但不具有函数调用的功能,如果需要调用函数必须先解引用unwrap_ref。可以包装对象的引用或者将不可拷贝的对象变为可以拷贝的。用于函数入参,无需拷贝。 int a=10; BOOST_AUTO(m,ref(a)); m是a的引用
reference_wrapper 引用包装 int x=10; reference_wrapper<int> rw(x);定义一个x的引用。ref和cref是reference_wrapper的typedef
unwrap_ref() 对任何对象的解包装将返回该对象的引用。常用于模版编程中,不管是不是包装对象,都可以对其解包装。
bind可以适配任意的可调用对象,包括函数指针、函数引用、成员函数指针和函数对象。如func(a1,a1)<=>bind(func,a1,a2)() bind最多接收9个参数
bind适配成员函数: class demo{init m;int f(int a,int b){;}} demo a; cout<<bind(&demo::f,a,10,20)()<<endl; cout<<bind(&demo::m,a)(); 绑定成员函数和成员变量
一般情况下bind返回的是一个函数对象。
函数类定义struct f {int operator()(int a,int b){return a+b;}} 定义了一个函数类。 f()(2,3)构造并调用该函数对象。
bind使用拷贝的方式存储绑定对象和参数,这意味着bind表达式的每一个变量都会有一份拷贝,代价较高。可以使用ref和cref解决拷贝代价。
int x=10;cout<<bind(f(),ref(x),cref(x))<<endl; //cref是常引用
bind自动推导被绑定对象的参数类型,但也有不能自动推到的时候,如printf这种变参的函数,这时需要指定参数的类型。bind<int,int,string>(printf,"%d+%d=%s",_1,_2,_3)(2,5,"7")
存储bind表达式:BOOST_AUTO(x,bind(sqrt,_1));
function函数对象(用于取代函数指针)。定义function<int(int,int)>fun或者function2<int,int,int)>fun;//定义一个容纳返回值为int,2个入参为int的函数对象。function可以接收bind的返回值,常用于回调应用。也可以自动适配ref
result_of可以自动推导function的返回值。
function代理普通函数:function<double(double)>func=sqrt; cout<<func(12.5);
function代理成员函数: struct demo_class{int add(int a,int b){return a+b;} int operator()(int x)const {return x*x;}};
function<int(demo_class&,int,int)>func1; func1=bind(&demo_class::add,_1,_2,_3); dema_class sc; cout<<func1(sc,10,20);
或 function<int(int,int)>func2; dema_class sc; func2=bind(&demo_class::add,sc,_2,_3); cout<<func2(10,20);//bind把一个成员函数适配成了一个普通函数。
function代理函数对象:function<int(int)>func3; func3=bind(dema_class(),_1);cout<< func3(12.5);或者 func3=sc或者func3=ref(sc);
signals2信号与槽机制:
连接普通函数:
signal<void()>sig;//创建一个无参无返回值的信号对象;
void slot1(){;}
void slot2(){;}//定义2个槽函数;
sig.connect(组号,&slot1,at_back);//connect的入参是一个函数对象。 默认为无组。
sig.connect(组合,&slot2,at_back);//连接槽1和槽2
sig();执行槽函数。按组号从小到大被调用,无组的at_front最先被调用,无组的at_back最后被调用
连接函数对象:struct slots{void operation()(){;}} ; sig.connect(slots());
连接function对象:function<double(double)>f=sqrt; signal<double(double)> sig; sig.connect(&f); cout<<sig(12.5);
信号的返回值:信号执行完之后可以默认的返回值是最好一个被调用槽的返回值的optional对象。如果需要其他的返回值方式,则需要一个合并器。
信号和连接使用了锁机制,可以很好的工作于多线程模式。当信号和槽被调用时,其内部的mutex会自动锁定。
通过share_ptr实现槽的自动连接管理(当槽失效时,自动断开连接):
int main(){
typedef signal<int(int)> signal_t;
typedef signal_t::slot_type slot_t;
signal_t sig;
shared_ptr<slots>p1(new slots());
shared_ptr<slots>p2(new slots());
function<int (int)> func=ref(*p1);
sig.connect(slot_t(func).track(p1));
sig.connect(slot_t(bind(&slots::operator(),p2.get(),_1)).track(p2)); //2种方式等价
p1.reset();
p2.reset();
assert(sig.num_slots()==0);
sig(1);//无函数被执行
}
12.并发编程
7种统一的互斥量:
mutext、try_mutex、timed_mutex、recursive_mutex、recursive_try_mutex、recursive_timed_mutex、share_mutex(读写锁)
使用范围锁scoped_loock: mutex mu; mutex::scoped_lock lock(mu); 可以方便的锁住和释放锁
basic_atom<T>提供了对数据类型的原子操作的模版
thread线程类.thread(函数名,形参1,形参2,..); thread类包含了较多的线程管理函数,如:.join(),timed_join(),.detach(),.interrupt(),interrupt_requested,yild(),.sleep()...
boost线程可以启用和禁止中断。
thread_group线程组。thread_group tg;tg.creat_thread(...);tg.creat_thread(...)...;tg.join_all();
condition_variable_any 条件变量(与mutex配合使用)
future与packaged_task和promise(用于在线程形参处返回值)类实现主动对象模型。用于耗时算法,或者需要有返回值的线程。
int fab(int n)
{if(n==0 || n==1)
{return 1;}
reurn fab(n-1)+fab(n-2);
}
main(){
packaged_task<int>pt(bind(fab,10));
unique_future<int>uf=pt.get_future();
thread(boost::move(pt));
uf.wait();
assert(uf.is_ready()&&uf.has_value());
cout<<uf.get();
}
barrier栅栏类
thread_specific_ptr<> 线程本地存储类
at_thread_exit()挂载一个函数在线程结束时执行的函数
boost的asio同步和异步io操作
io_service 完成io调度
deadline_timer 可以挂载定时执行的函数
address、socket、acceptor、...等提供了socket的通讯连接方式
本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1795059,如需转载请自行联系原作者