条款54: 让自己熟悉包括TR1在内的标准程序库
Familiarize yourself with the standard library, including TR1.c++ Standard(定义C++语言及其标准程序库的规范)早在1998年就被标准委员会核准了. TR1代表"Technical Report 1".在概括论述TR1有些什么之前,先回顾C++98列入的C++标准程序库有哪些主要成分:
STL(Standard Template Library,标准模板库),覆盖容器(container如vector,string,map),迭代器(iterator),算法(algorithm如find,sort,transform),函数对象(function objects如less,greater),各种容器适配器(container adapter如stack,priority_queue)和函数对象适配器(function obejct adapter如mem_fun,not1).
Iostreams,覆盖用户自定缓冲区功能,国际化I/O,以及预先定义好的对象cin,cout,cerr和clog.
异常阶层体系(exception hierarchy).
C89标准程序库
TR1详细叙述了14个新组件(components,也就是程序库机能单位),统统都放在std命名空间内,更准确地说是嵌套命名空间tr1内.因此,TR1组件shared_ptr的全名是std::tr1::shared_ptr.
本书展示以下 TR1组件实例:
智能指针(smart pointers) tr1::shared_ptr和tr1::weak_ptr.前者的作用类似内置指针,但会记录有多少个tr1::shared_ptr共同指向同一个对象.这就是所谓的引用计数.一旦最后一个这样的指针被销毁,也就是一旦某对象的引用计数变为0,这个对象会被自动删除.这在非环形数据结构中防止资源泄露很有帮助,但如果两个或多个对象内含tr1::shared_ptr并形成环状,这个环形会造成每个对象的引用次数都超过0.
tr1::function,此物得以表示任何callable entity(可调用物,也就是任何函数或 函数对象),只要其签名符合目标.
tr1::bind,它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事,而又更多.
Hash tables,用来实现sets,multisets和multi-maps.
正则表达式.
tr1::array,本质上是个"STL化"数组,即一个支持成员函数如begin和end的数组.
tr1::mem_fn,这是个语句构造上与成员函数指针一致的东西.
tr1::reference_wrapper,一个"让references的行为更像对象"的设施.
Type traits,一组traits class(详见条款47),用以提供类型的编译期信息.
tr1::result_of,这是个 template,用来推导函数调用的返回类型.
注意:
C++标准程序库的主要机能由STL,iostream,locales组成,并包括C99标准程序库.
TR1添加了智能指针(如tr1::shared_ptr),一般化函数指针(tr1::function),hash_table容器,正则表达式(regular expressions)以及另外10个组件的支持.
TR1自身只是一份规范,为获得TR1提供的好处,需要一份事物,一个好的事物来源是Boost.
条款55: 让自己熟悉Boost
Familiarize yourself with Boost.Boost是个可自由下载的C++程序库群.Boost各程序库之间的大小和作用范围由很大变化.举个极端例子,某些程序库概念上只需数行代码(但在假如错误处理和可移植性后往往变长很多).例如Conversion程序库,提供较安全或较方便的转型操作符,其numeric_cast函数在将数值从某类型转换为另一类型而导致溢出或类似问题时抛出异常.
Boost程序库对付的主题非常繁多,区分数十个类目,包括:
字符串与文本处理,覆盖具备类型安全的printf-like格式化动作,正则表达式和解析.
容器,覆盖"接口与STL相似且大小固定"的数组,大小可变的bitsets以及多维数组.
函数对象和高级编程,覆盖若干用来作为TR1机能基础的程序库.其中一个程序库是Lambda,它使得可以轻松地创建函数对象.
using namespace boost::lambda; // 让boost::lambda的机能曝光
std::vector<int> v;
...
std::for_each(v.begin(), v.end(), std::cout << _l * 2 + 10 << "\n");
// 针对v内的每一个元素x,印出x * 2 + 10;
// 其中"_l"是Lambda程序库针对当前元素的一个占位符号
泛型编程(Generic programming),覆盖一大组traits class,详见
条款47.
模板元编程(Template metaprogramming,TMP,详见 条款48),覆盖一个针对编译期assertion而写的程序库,以及Boost MPL程序库.
正确性测试(Correctness and testing),覆盖用来将隐式模板接口(implicit template interfaces,详见 条款41)形式化的程序库,以及针对"测试优先"编程形态而设计的措施.
内存,覆盖Pool程序库,用来做出高效率而区块带下固定的分配器(详见 条款50),以及多变化的智能指针(详见 条款13),包括TR1智能指针.
注意:
Boost是一个社群,也是一个网站.致力于免费,源码开放,的C++程序库开发.
Boost提供许多TR1组件实现品,以及其他许多程序库.