C++ Technical Report 1
C++ Technical Report 1(TR1)是ISO/IEC TR 19768, C++ Library Extensions(函式庫擴充)的一般名稱。TR1是一份文件,內容提出了對C++標準函式庫的追加項目。這些追加項目包括了正则表达式、智能指针、哈希表、随机数生成器等。TR1自己並非標準,它是一份草稿文件。然而它所提出的項目大多数已成為的C++11及之后版本的官方標準的一部分。這份文件的目標在於「為擴充的C++標準函式庫建立更為廣泛的現成實作品」。
概要[编辑]
編譯器並不需要保證包含TR1的組件,因為TR1并非官方标准的一部分。順帶一提,Boost提供了TR1大部分的實作,數個編譯器/函式庫開發商也已提供了各自的實作版本。
TR1並不代表下一屆標準的全部;舉例而言,下一屆的標準C++11包含了线程的支援。
新的組件被放置在std::tr1的命名空間(namespace)裡,以和現在的標準函式庫做區別。
TR1的內容[编辑]
TR1包含以下組件:
一般用途[编辑]
- 引用包装器(Reference Wrapper)
- 來自Boost.Ref [1]
- 在
<functional>头文件中增加了 -cref、ref、reference_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)
- 基于Boost Smart Pointer library[2]
- 由
<memory>头文件增加了 -shared_ptr、weak_ptr等 - 将Resource Acquisition Is Initialization(RAII)手法用於内存管理和異常安全性。
仿函数[编辑]
以下四個模組被加進<functional>標頭檔之中:
- 多形態的函式包裝器(Polymorphic Function Wrapper)
function- 基於Boost.Function[3]
- 儲存任何使用特定函式簽名的"可呼叫物"(函数指针、成員函式指针、仿函数),不需要可呼叫物確切的型別。
- 仿函数綁定器(Function Object Binders)
bind- 採納自Boost Bind library[4]
- 標準
std::bind1st和std::bind2nd的通用版 - 將參數綁定給仿函数,並且允許函式的結合。
- 函式返回型別
result_of- 採納自Boost
- 決定函式呼叫的返回型別
- 成員函式
mem_fn- 採納自Boost Mem Fn library[5]
- 標準
std::mem_fun和std::mem_fun_ref的加強版 - 允許成員函式指针能夠像仿函数一樣
元編程和型別特性(Type Traits)[编辑]
- 新的
<type_traits>头文件 -is_pod、has_virtual_destructor、remove_extent等 - 採納自Boost Type Traits library[6]
- 允許类编查询以及类别間的轉換,可促進元編程
數值工具[编辑]
随机数產生器[编辑]
- 新的
<random>头文件 -variate_generator、mersenne_twister、poisson_distribution等 - 採納自Boost Random Number Library[7]
數學函式[编辑]
- 新的
<cmath>/<math.h>头文件 -beta、legendre等
- 23種數學函式
| 函数名 | 函数原型 | 数学表达式 |
|---|---|---|
| 连带拉盖尔多项式 | double assoc_laguerre( unsigned n, unsigned m, double x ) ; | <math>{L_n}^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n+m}(x), \text{ for } x \ge 0</math> |
| 连带勒让德多项式 | double assoc_legendre( unsigned l, unsigned m, double x ) ; | <math>{P_l}^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m} P_l(x), \text{ for } x \ge 0</math> |
| Beta 函数 | double beta( double x, double y ) ; | <math>\Beta(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}</math> |
| 第一类完全椭圆积分 | double comp_ellint_1( double k ) ; | <math>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}}</math> |
| 第二类完全椭圆积分 | double comp_ellint_2( double k ) ; | <math>E\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \sqrt{1 - k^2 \sin^2 \theta}\; d\theta</math> |
| 第三类完全椭圆积分 | double comp_ellint_3( double k , double nu ) ; | <math>\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}}</math> |
| 合流超几何函数 | double conf_hyperg( double a, double c, double x ) ; | <math>F(a, c, x) = \frac{\Gamma(c)}{\Gamma(a)} \sum_{n = 0}^\infty \frac{\Gamma(a + n) x^n}{\Gamma(c + n) n!}</math> |
| 第一类变形贝塞尔函数 | double cyl_bessel_i( double nu, double x ) ; | <math>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</math> |
| 第二类变形贝塞尔函数 | double cyl_bessel_j( double nu, double x ) ; | <math>J_\nu(x) = \sum_{k = 0}^\infty \frac{(-1)^k \; (x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0</math> |
| 第三类变形贝塞尔函数 | double cyl_bessel_k( double nu, double x ) ; | <math>\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}</math> |
| 柱诺依曼函数 | double cyl_neumann( double nu, double x ) ; | <math>
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}
</math> |
| 第一类不完全椭圆积分 | double ellint_1( double k, double phi ) ; | k\right| \le 1</math> |
| 第二类不完全椭圆积分 | double ellint_2( double k, double phi ) ; | k\right| \le 1</math> |
| 第三类不完全椭圆积分 | double ellint_3( double k, double nu, double phi ) ; | k\right| \le 1</math> |
| 指数积分 | double expint( double x ) ; | <math> \mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt</math> |
| 埃爾米特多項式 | double hermite( unsigned n, double x ) ; | <math>H_n(x)=(-1)^n e^{x^2}\frac{d^n}{dx^n}e^{-x^2}\,\!</math> |
| 超几何级数 | double hyperg( double a, double b, double c, double x ) ; | <math>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!}</math> |
| 拉盖尔多项式 | double laguerre( unsigned n, double x ) ; | <math>L_n(x)=\frac{e^x}{n!}\frac{d^n}{dx^n}\left(x^n e^{-x}\right), \text{ for } x \ge 0</math> |
| 勒让德多项式 | double legendre( unsigned l, double x ) ; | x\right| \le 1 </math> |
| 黎曼zeta函数 | double riemann_zeta( double x ) ; | <math>
\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}
</math> |
| 第一类球贝塞尔函数 | double sph_bessel( unsigned n, double x ) ; | <math>j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x), \text{ for } x \ge 0</math> |
| 球谐函数 | double sph_legendre( unsigned l, unsigned m, double theta ) ; | m| \leq l</math> |
| 球诺依曼函数 | double sph_neumann( unsigned n, double x ) ; | <math>n_n(x) = \left(\frac{\pi}{2x}\right)^{\frac{1}{2}}N_{n+\frac{1}{2}}(x), \text{ for } x \ge 0</math> |
容器[编辑]
多元組型別(Tuple Types)[编辑]
定量陣列(Fixed Size Array)[编辑]
- 新
<array>標頭檔 -array - 來自Boost Array library[9]
- 与動態陣列型別,像是標準的
std::vector相反,是静态的矩阵,但是能够享受类似于begin()等与std::vector相似的接口。
哈希表(Hash Tables)[编辑]
- 新
<unordered_set>、<unordered_map>標頭檔 - 完全是新的實作,不衍生自既有之程式庫。與既有之程式庫API並不完全相容
- 就如同所有的哈希表提供常數時間的元素查找,但最壞情況查找時間與容器的大小呈線性關係。
正規表示式[编辑]
- 新
<regex>標頭檔 -regex、regex_match、regex_search、regex_replace等 - 来自Boost RegEx library[10]
- pattern matching library
C的兼容性[编辑]
C++被設計成與C語言兼容,但由於不同的標準,C++並不是C的嚴格超集合。TR1試圖調和這些差異,透過對各種標頭檔,如<complex>、<locale>、<cmath>等進行擴充。 這些改變幫助C++能夠與C99版本的C標準更為一致(並非所有C99都包含於TR1)。
關聯項目[编辑]
- C++11,C++新標準
- C99,C語言標準
- Boost library,提供大量的C++程式庫,數個包含於TR1
- STL標準模板庫,現行C++標準程式庫的一部分
参考文献[编辑]
腳註[编辑]
- ↑ ref - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-04-03).
- ↑ Boost.SmartPtr: The Smart Pointer Library - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-04-03).
- ↑ Chapter 16. Boost.Function - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-04-03).
- ↑ Chapter 1. Boost.Bind - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-04-03).
- ↑ Chapter 1. Boost.Member Function - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-04-03).
- ↑ Chapter 1. Boost.TypeTraits - 1.37.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-07-15).
- ↑ [1](页面存档备份,存于互联网档案馆)
- ↑ The Boost Tuple Library – Boost 1.48.0. [2006-05-27]. (原始内容存档于2006-05-26).
- ↑ Chapter 5. Boost.Array - 1.72.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-07-01).
- ↑ Boost.Regex - 1.36.0. www.boost.org. [2022-07-01]. (原始内容存档于2022-07-11).
其他[编辑]
- ISO/IEC JTC1/SC22/WG21. Draft Technical Report on C++ Library Extensions (PDF). 2005-06-24 [2009-01-27]. (原始内容存档 (PDF)于2011-04-14).
- Becker, Peter. The C++ Standard Library Extensions: A Tutorial and Reference. Addison-Wesley Professional. 2006. ISBN 0-321-41299-0.
外部連結[编辑]
- Scott Meyers' Effective C++: TR1 Information(页面存档备份,存于互联网档案馆) - 包含TR1提案文件的連結,提供了TR1程式庫的背景以及理由。