Effective C++ 条款54 让自己熟悉包括TR1在内的标准程序库

1. TR1(Technical Report 1)是C++ 03标准的一个扩展,它并不属于C++ 03标准,只是一份草稿文件,用于指出下一版C++标准很可能吸收的特性.目前,它的大部分已被C++ 11采纳,成为官方标准.

2. C++ 98列出的标准库的组成:

STL(Standard Template Library,标准模板库).包含容器,迭代器,算法,函数对象,各种容器适配器(container adapter)和函数对象适配器(function object adapter)等.

Iostream.覆盖用户自定缓冲功能,国际化I/O,以及预先定义好的对象cout和cin.

国际化支持.比如多区域(multiple active locales)能力.像wchar_t(通常是16 bits/char)和wstring(有wchar_t组成的string)等类型都对促进Unicode有帮助.

数值处理.包括复数模板好纯数值数组.

异常阶层体系(exception hierarchy):包括base class exception及其derived class logic_error和runtime_error,以及更深继承的各个classes.

C89标准程序库.

3. TR1详细叙述了14个新组件(compnents),统统放在std命名空间的嵌套空间tr1内,包括:

智能指针.如tr1::shared_ptr,tr1::weak_ptr等,详见条款13.

tr1::function.此物可以表示任何callable entity(可调用物,也就是函数和函数对象),只要其签名复合目标,详见条款35.

tr1::bind.它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事且增加了更多特性:tr1::bind可以和const金额non-const成员函数共同运作,可以和by-reference参数协同运作,而且不需要特殊协助就可以处理函数指针.详见条款35

Hase tables.用来实现sets,multisets,maps,multimaps,每个容器接口都与之前标准相同,其命名为"tr1::unordered_set", "tr1::unordered_multiset", "tr1::unordered_map","tr1::unordered_multimap",说明它们和set,multiset,map,multimap的不同:以hash为基础的这些tr1容器内的元素并无可预期次序.

正则表达式(Regular expressions).包括包括以正则表达式为基础的字符串查找和替换,或是从某个匹配字符串到另一个匹配字符串的注意迭代等等.

Tuples(变量组).标准库pair template的新一代制品,pair只能持有两个对象,而tr1::tuple可持有任意个数对象.

tr1::array.本质上是个"STL化"数组,即一个支持成员函数如begin和end的数组.不过tr1::array的大小固定,并不适用动态内存.

tr1::mem_fn.其语句构造与成员函数指针一致,正如tr1::bind纳入并扩充了C++ 98的bind1st和bind2nd的能力,mem_fn纳入并扩充了C++98的mem_fun和mem_fun_ref的能力.

tr1::reference_wrapper."让reference的行为更像对象",造成容器"犹如持有reference".

随机数生成工具.大大超越了rand.

数学特殊函数,包括Laguerre多项式,Bessel函数,完全椭圆积分(complete elliptic integrals)以及其他函数.

C99 兼容扩充.一大堆函数和模板,用来将许多C99程序库特性带劲C++.

第二组TR1组件由更精巧的template编程技术(包括模板元编程,template metaprogramming,见条款48)构成:

Type traits.一组trait classes(见条款47),用以提供类型的编译期信息.如指出某个类型是否是个内置类型,是否提供virtual析构函数,是否是个empty class,是否可隐式转换为其他类型等等.TR1的type traits也可以显现该给定类型之适当齐位(proper alignment),这对定制性内存分配器(见条款50)的编写十分重要.

tr1::result_of.这是个template,用来推导函数调用的返回类型,tr1::result_of使得"指涉函数返回类型"变得十分容易.

4. TR1本身只是一份文档,并不涉及实现.然而TR1的14个组件中的10个已在免费的Boost程序库(见条款55)提供支持,虽然有些Boost机能并不完全吻合TR1规范.

所有的boost组件都位于命名空间boost内,可以使用

namespace std{
    namespace std::tr1=::boost;
}

通过指涉std::tr1::来指涉::boost

时间: 2024-10-06 03:07:36

Effective C++ 条款54 让自己熟悉包括TR1在内的标准程序库的相关文章

读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库

1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准.在2003年,一个小的“修复bug”版本被发布.然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C++标准预计在2009年被发布(虽然所有的工作很有可能在2007年底被完成).直到现在,发布下一版C++的预计年份还没有被确定,这就解释了为什么人们把下一版C++叫做“C++0x”——C++的200x年版本. C++0x可能会包含一些有趣的新的语言特性,但是大多数新C++功能将会以标准库附加物的形式被

Effective C++ 条款55 让自己熟悉Boost

1. Boost是一个C++开发者集结的社群,也是一个可自由下载的C++程序库群,它的网址是http://Boost.org.C++组织和网站有很多,但Boost有两个特性是其他组织无可匹敌的:第一,Boost由C++标准委员会成员创设,因此和C++标准委员会之间有着独一无二的密切关系,作为一个"可被加入标准C++之各种功能"的测试场是Boost的目标之一,实际上,以TR1(见条款54)提案进入标准C++的14个新程序库,超过三分之二奠基于Boost的工作成果.第二,它以公开的同僚复审

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数

Effective C++——条款13(第3章)

第3章    资源管理 Resource Management 所谓资源就是,一旦用了它,将来必须还给系统.C++程序中最常使用的资源就是动态内存分配(如果分配内存从来都增归还,会导致内存泄露).其他常见的资源还有文件描述符(file descriptors),互斥锁(mutex locks),图形界面中的字型和笔刷,数据库连接,以及网络sockets.不论哪一种资源,重要的是,不再使用它时,必须将它还给系统. 条款13:    以对象管理资源 Use objects to manage res

Effective C++ 条款11,12 在operator= 中处理“自我赋值” || 复制对象时不要忘记每一个成分

1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

Effective C++ 条款3 尽可能用const

1. const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.用const修饰指针,如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存.另外int const*p和const int*p含义相同.如果对象成员有普通指针,那么构造该类的一个const对象时,const修饰使得该指针只能指向同一块内存,但指针指向的内容可以改变. 2. 将某些东西声明为const可以帮助编译器侦测出错误用法. 3. 编译器强制实

effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investment {}; Investment* creatInvestment(){...} // factory function to produce investment object void main() { Investment* pInv = creatInvestment();//call t