C++ Technical Report 1

C++ Technical Report 1 (TR1)(英文)ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称。TR1是一份文件,内容提出了对C++标准函式库的追加项目。这些追加项目包括了正则表达式智能指针哈希表随机数生成器等。TR1自己并非标准,他是一份草稿文件。然而他所提出的项目很有可能成为下次的官方标准。这份文件的目标在于“为扩充的C++标准函式库建立更为广泛的现成实作品”。

目录

   [隐藏

[编辑]概要

编译器并不需要保证包含TR1的组件,因为TR1尚未成为官方标准的一部分。顺带一提,Boost提供了TR1大部分的实作,数个编译器/函式库开发商也已提供了各自的实作版本。

TR1并不代表下一届标准的全部;举例而言,下一届的标准C++0x也许会包含线程的支援。还有TR2计划于C++0x标准之后发布。

新的组件被放置在std::tr1命名空间namespace)里,以和现在的标准函式库做区别。

[编辑]TR1的内容

TR1包含以下组件:

[编辑]一般用途

[编辑]引用包装器(Reference Wrapper)
  • 来自Boost.Ref [1]
  • <functional> 头文件中增加了 - crefrefreference_wrapper
  • 可以对算法(algorithms)或仿函数(function objects)传递引用references),而不是传递副本。

一个wrapper reference是由模板类reference_wrapper产生的实体(instance)获得。wrapper reference近似于C++语言中的引用。

使用ref以获得任何实例的wrapper reference(对常数引用const &使用cref)。

wrapper reference对模板函数(template function)尤其有用,当模板参数推导不出引用的时候(范例如下:)

void f( int &r ) { r++; }
 
template< class Funct, class Arg >
void g( Funct f, Arg t )
{
  f(t);
}
 
int main()
{
  int i = 0;
  g( f, i );          // 'g< void(int &r), int >' 被实例化
  cout << i << endl;  // 輸出:0
 
  g( f, ref(i) );     // 'g< void(int &r), reference_wrapper<int> >' 被实例化
  cout << i << endl;  // 輸出:1
}
[编辑]智能指针(Smart Pointers)

[编辑]仿函数

以下四个模组被加进<functional>标头档之中:

[编辑]多形态的函式包装器(Polymorphic Function Wrapper)
  • function
  • 基于Boost.Function [3]
  • 储存任何使用特定函式签名的"可呼叫物"(函数指针、成员函式指针、仿函数),不需要可呼叫物确切的型别。
[编辑]仿函数绑定器(Function Object Binders)
  • bind
  • 采纳自Boost Bind library [4]
  • 标准std::bind1ststd::bind2nd的通用版
  • 将参数绑定给仿函数,并且允许函式的结合。
[编辑]函式返回型别(Function Return Types)
  • result_of
  • 采纳自Boost
  • 决定函式呼叫的返回型别
[编辑]mem_fn
  • mem_fn
  • 采纳自Boost Mem Fn library [5]
  • 标准std::mem_funstd::mem_fun_ref的加强版
  • 允许成员函式指针能够像仿函数一样

[编辑]元编程和型别特性(Type Traits)

  • 新的<type_traits>头文件 - is_podhas_virtual_destructorremove_extent
  • 采纳自Boost Type Traits library [6]
  • 允许类编查询以及类别间的转换,可促进元编程

[编辑]数值工具

[编辑]随机数产生器
  • 新的<random>头文件 - variate_generatormersenne_twisterpoisson_distribution
  • 采纳自Boost Random Number Library[7]
[编辑]数学函式
  • 新的<cmath>/<math.h>头文件 - betalegendre
  • 23种数学函式
函数名 函数原型 数学表达式
连带拉盖尔多项式double assoc_laguerre( unsigned n, unsigned m, double x ) ;{L_n}^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n+m}(x), \text{ for } x \ge 0
连带勒让德多项式double assoc_legendre( unsigned l, unsigned m, double x ) ;{P_l}^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m} P_l(x), \text{ for } x \ge 0
Beta 函数double beta( double x, double y ) ;\Beta(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}
第一类完全椭圆积分double comp_ellint_1( double k ) ;K(k) = F\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{\sqrt{1 - k^2 \sin^2 \theta}}
第二类完全椭圆积分double comp_ellint_2( double k ) ;E\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \sqrt{1 - k^2 \sin^2 \theta}\; d\theta
第三类完全椭圆积分double comp_ellint_3( double k , double nu ) ;\Pi\left(\nu, k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{(1 - \nu \sin^2 \theta)\sqrt{1 - k^2 \sin^2 \theta}}
合流超几何函数double conf_hyperg( double a, double c, double x ) ;F(a, c, x) = \frac{\Gamma(c)}{\Gamma(a)} \sum_{n = 0}^\infty \frac{\Gamma(a + n) x^n}{\Gamma(c + n) n!}
第一类变形贝塞尔函数double cyl_bessel_i( double nu, double x ) ;I_\nu(x) = i^{-\nu} J_\nu(ix) = \sum_{k = 0}^\infty \frac{(x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0
第二类变形贝塞尔函数double cyl_bessel_j( double nu, double x ) ;J_\nu(x) = \sum_{k = 0}^\infty \frac{(-1)^k \; (x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0
第三类变形贝塞尔函数double cyl_bessel_k( double nu, double x ) ;\begin{align}K_\nu(x) & = \textstyle\frac{\pi}{2} i^{\nu+1} \big(J_\nu(ix) + i N_\nu(ix)\big) \\         & = \begin{cases}                 \displaystyle \frac{I_{-\nu}(x) - I_\nu(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt]                 \displaystyle \frac{\pi}{2} \lim_{\mu \to \nu} \frac{I_{-\mu}(x) - I_\mu(x)}{\sin \mu\pi}, & \text{for } x < 0 \text{ and } \nu \in \mathbb{Z} \\             \end{cases}\end{align}
柱诺依曼函数

第二类柱贝塞尔函数

double cyl_neumann( double nu, double x ) ;N_\nu(x) = \begin{cases}                 \displaystyle \frac{J_\nu(x)\cos \nu\pi - J_{-\nu}(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt]                 \displaystyle \lim_{\mu \to \nu} \frac{J_\mu(x)\cos \mu\pi - J_{-\mu}(x)}{\sin \mu\pi}, & \text{for } x < 0 \text{ and } \nu \in \mathbb{Z} \\             \end{cases}
第一类不完全椭圆积分double ellint_1( double k, double phi ) ;F(k,\phi)=\int_0^\phi\frac{d\theta}{\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1
第二类不完全椭圆积分double ellint_2( double k, double phi ) ;\displaystyle E(k,\phi)=\int_0^\phi\sqrt{1-k^2\sin^2\theta}d\theta, \text{ for } \left|k\right| \le 1
第三类不完全椭圆积分double ellint_3( double k, double nu, double phi ) ;\Pi(k,\nu,\phi)=\int_0^\phi\frac{d\theta}{\left(1-\nu\sin^2\theta\right)\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1
指数积分double expint( double x ) ; \mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt
厄米多项式double hermite( unsigned n, double x ) ;H_n(x)=(-1)^n e^{x^2}\frac{d^n}{dx^n}e^{-x^2}\,\!
超几何级数double hyperg( double a, double b, double c, double x ) ;F(a,b,c,x)=\frac{\Gamma(c)}{\Gamma(a)\Gamma(b)}\sum_{n = 0}^\infty\frac{\Gamma(a+n)\Gamma(b+n)}{\Gamma(c+n)}\frac{x^n}{n!}
拉盖尔多项式double laguerre( unsigned n, double x ) ;L_n(x)=\frac{e^x}{n!}\frac{d^n}{dx^n}\left(x^n e^{-x}\right), \text{ for } x \ge 0
勒让德多项式double legendre( unsigned l, double x ) ;P_l(x) = {1 \over 2^l l!} {d^l \over dx^l } (x^2 -1)^l, \text{ for } \left|x\right| \le 1
黎曼zeta函数double riemann_zeta( double x ) ;\Zeta(x) =          \begin{cases}                 \displaystyle \sum_{k = 1}^\infty k^{-x}, & \text{for } x > 1 \\[10pt]                 \displaystyle 2^x\pi^{x-1}\sin\left(\frac{x\pi}{2}\right)\Gamma(1-x)\zeta(1-x), & \text{for } x < 1 \\             \end{cases}
第一类球贝塞尔函数double sph_bessel( unsigned n, double x ) ;j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x), \text{ for } x \ge 0
球谐函数double sph_legendre( unsigned l, unsigned m, double theta ) ; Y_{l}^{m}(\theta, 0) \text{ where } Y_{l}^{m}(\theta, \phi) = (-1)^{m}\left[\frac{(2l+1)}{4\pi}\frac{(l-m)!}{(l+m)!}\right]^{1 \over 2} P_{l}^{m}(\cos \theta)e^{\mathrm{i}m\phi}, \text{ for } |m| \leq l
球诺依曼函数

第二类球贝塞尔函数

double sph_neumann( unsigned n, double x ) ;n_n(x) = \left(\frac{\pi}{2x}\right)^{\frac{1}{2}}N_{n+\frac{1}{2}}(x), \text{ for } x \ge 0

[编辑]容器

[编辑]多元组型别(Tuple Types)
  • <tuple>标头档 - tuple
  • 采纳自Boost Tuple library [8]
  • 标准std::pair的扩充
  • 固定尺寸的元素集合,元素可以是不同的类型
[编辑]定量阵列(Fixed Size Array)
  • <array>标头档 - array
  • 来自Boost Array library [9]
  • 与动态阵列型别,像是标准的std::vector相反,是静态的矩阵,但是能够享受类似于begin()等与std::vector相似的接口。
[编辑]哈希表(Hash Tables)
  • <unordered_set><unordered_map>标头档
  • 完全是新的实作,不衍生自既有之程式库。与既有之程式库API并不完全相容
  • 就如同所有的哈希表提供常数时间的元素查找,但最坏情况查找时间与容器的大小呈线性关系。

[编辑]正规表示式(Regular Expressions)

  • <regex>标头档 - regexregex_match、 regex_searchregex_replace
  • 来自Boost RegEx library [10]
  • pattern matching library

[编辑]C的兼容性

C++被设计成与C语言兼容,但由于不同的标准,C++并不是C的严格超集合。TR1试图调和这些差异,透过对各种标头档,如<complex>、<locale>、<cmath>等进行扩充。 这些改变帮助C++能够与C99版本的C标准更为一致(并非所有C99都包含于TR1)。

[编辑]关联项目

[编辑]参照

[编辑]外部链接


转自:http://zh.wikipedia.org/wiki/C%2B%2B_Technical_Report_1#Smart_pointers


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值