关于宽字符:

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的通讯连接方式