关于宽字符:
wstring 为宽字符,宽字符串需要用L修饰wstring str=L"LMKD"; 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.内存管理 智能指针和内存池是二种不同的内存管理机制,都可以有效的主动释放内存。 RAII机制-资源获取即初始化 scoped_ptr 类似与auto_ptr(同一时刻只可能有一个auto_ptr管理对象),不能转移对象管理权,超出作用域时自动析构 scoped_array shared_ptr shared_array make_shared()使用了引用计数,share_ptr可以让不能拷贝的对象实现拷贝或共享。应用于工厂模型作为返回值,可以有效的管理内存。 enable_share_from_this 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.实用工具 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 BOOST_TYPEOF_REGISTER_TYPE() 宏,向boost库注册自定义的类。然后该类才能使用自动推导。 optional boost重载了 ’+=‘ ’,‘ ‘()’ 三种操作符。函数list_of(),push_back(),push_front(),insert() 以及.repeat()和range() assign.hpp 中的 += 赋值 map assign.hpp 中的关联容器赋值insert(m)(make_pare(1,"one"))(make_pare(2,"two"))(make_pare(3,"three")) assign.hpp 中的顺序容器赋值list assign.hpp 中range迭代器赋值deque assign.hpp 中的初始化时赋值 list_of,map_list_of/pair_list_of,tuple_list_of. map assign.hpp 中repeat减少赋值重复输入 vecttor assign.hpp 中repeat_fun通过回调函数来决定重复的值vecttor assign.hpp 中对容器适配器赋值时需要 to_adapter()转换 stack 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 singleton_default 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.字符串与文本处理 lexical num_valid 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.正确性测试 assert断言(在release模式下无效) BOOST_VERIFY校验(在release模式下无效) ... 7.容器与数据结构 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 variant 可变类型变量(与any很像),是对union概念的增强和扩展。variant 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 ref() cref(常引用) 返回对象的引用,但不具有函数调用的功能,如果需要调用函数必须先解引用unwrap_ref。可以包装对象的引用或者将不可拷贝的对象变为可以拷贝的。用于函数入参,无需拷贝。 int a=10; BOOST_AUTO(m,ref(a)); m是a的引用 reference_wrapper 引用包装 int x=10; reference_wrapper 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返回的是一个函数对象。 函数类定义struct f {int operator()(int a,int b){return a+b;}} 定义了一个函数类。 f()(2,3)构造并调用该函数对象。 bind使用拷贝的方式存储绑定对象和参数,这意味着bind表达式的每一个变量都会有一份拷贝,代价较高。可以使用ref和cref解决拷贝代价。 int x=10;cout< bind自动推导被绑定对象的参数类型,但也有不能自动推到的时候,如printf这种变参的函数,这时需要指定参数的类型。bind 存储bind表达式:BOOST_AUTO(x,bind(sqrt,_1)); function函数对象(用于取代函数指针)。定义function result_of可以自动推导function的返回值。 function代理普通函数:function function代理成员函数: struct demo_class{int add(int a,int b){return a+b;} int operator()(int x)const {return x*x;}}; function 或 function function代理函数对象:function signals2信号与槽机制: 连接普通函数: signal 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 信号的返回值:信号执行完之后可以默认的返回值是最好一个被调用槽的返回值的optional对象。如果需要其他的返回值方式,则需要一个合并器。 信号和连接使用了锁机制,可以很好的工作于多线程模式。当信号和槽被调用时,其内部的mutex会自动锁定。 通过share_ptr实现槽的自动连接管理(当槽失效时,自动断开连接): int main(){ typedef signal typedef signal_t::slot_type slot_t; signal_t sig; shared_ptr shared_ptr function 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 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 unique_future thread(boost::move(pt)); uf.wait(); assert(uf.is_ready()&&uf.has_value()); cout< } barrier栅栏类 thread_specific_ptr<> 线程本地存储类 at_thread_exit()挂载一个函数在线程结束时执行的函数 boost的asio同步和异步io操作 io_service 完成io调度 deadline_timer 可以挂载定时执行的函数 address、socket、acceptor、...等提供了socket的通讯连接方式