C ++テクニカルレポート1


C++_Technical_Report_1

 「C ++テクニカルレポート1」  
C ++テクニカルレポート1(TR1)は、ISO / IEC TR 19768、C ++ Library Extensionsの一般名であり、C ++ 03言語標準のC ++標準ライブラリへの追加を提案したドキュメントです。追加には、正規表現、スマートポインター、ハッシュテーブル、および乱数ジェネレーターが含まれます。TR1はそれ自体が標準ではなく、ドラフト文書でした。ただし、その提案のほとんどは、後の公式標準であるC ++ 11の一部になりました。。C ++ 11が標準化される前は、ベンダーはこのドキュメントを拡張機能を作成するためのガイドとして使用していました。レポートの目標は、「拡張されたC ++標準ライブラリのより広範な既存のプラクティスを構築すること」でした。
このレポートは、2005年にC ++ライブラリ拡張に関するドラフトテクニカルレポートとしてドラフト形式で最初に配布され、2007年にISO / IEC TR 19768:2007としてISO / IEC標準として公開されました。

コンテンツ
1 概要
2 コンポーネント
2.1 一般的なユーティリティ 2.2 関数オブジェクト 2.3 メタプログラミングとタイプ特性 2.4 数値設備
2.4.1 乱数の生成
2.4.2 数学的特殊関数
2.5 コンテナ
2.5.1 タプルタイプ
2.5.2 固定サイズの配列
2.5.3 ハッシュテーブル
2.62.6 正規表現 2.7 C互換性
3 テクニカルレポート2
4 も参照してください
5 参考文献
5.1 ソース
6 外部リンク

概要
TR1の提案は標準自体の一部ではなく、まだ承認されていない可能性のある追加のセットのみであるため、コンパイラはC ++標準に準拠するためにTR1コンポーネントを含める必要はありませんでした。ただし、TR1のほとんどはBoostから入手可能であり、いくつかのコンパイラ/ライブラリディストリビュータがすべてまたは一部のコンポーネントを実装していました。TR1は、C ++ 11に登場したライブラリへの追加の完全なリストではありません。たとえば、C ++ 11には、TR1では使用できないスレッドサポートライブラリが含まれています。
新しいコンポーネントは、当時の標準ライブラリと区別するためにstd::tr1 名前空間で定義されました。

コンポーネント
TR1には、次のコンポーネントが含まれています。

一般的なユーティリティ
参照ラッパー–コピーではなく、参照をアルゴリズムまたは関数オブジェクトに渡すことができます。この機能はBoost.Refに基づいていました。ラッパー参照は、テンプレートクラスのインスタンスから得られますreference_wrapper。ラッパー参照は、C ++言語の通常の参照(「&」)に似ています。任意のオブジェクトからラッパー参照を取得するにrefは、テンプレートクラスを使用します(定数参照のcref場合)。
ラッパー参照は、引数の推定が参照を推定しない場合(たとえば、引数を転送する場合)に、とりわけテンプレート関数に役立ちます。
#include #include void f (int &r ){ ++ r ; }<クラスFunct 、クラスArg > void g (Funct f 、Arg t )
{{ f (t );}int main () {{ int i = 0 ; g (f 、i ); // ‘g ‘がインスタンス化されますstd :: cout << i << " n " ; //出力:0
g (f 、std :: tr1 :: ref (i )); // ‘g >’はインスタンス化されますstd :: cout << i << " n " ; //出力:1 }
スマートポインタ–複雑な場合のオブジェクトの存続期間管理を簡素化するいくつかのクラスを追加します。3つの主要なクラスが追加されます。
shared_ptr –参照カウントされたスマートポインター
weak_ptr–そのバリアントはshared_ptr参照数を増やしません
この提案は、Boost SmartPointerライブラリに基づいています。

関数オブジェクト
これらの4つのモジュールがヘッダーファイルに追加されます。
ポリモーフィック関数ラッパー(function)–指定された関数呼び出しシグネチャを使用する任意の呼び出し可能関数(関数ポインター、メンバー関数ポインター、および関数オブジェクト)を格納できます。タイプは、使用される呼び出し可能オブジェクトの種類に依存しません。Boost.Functionに基づく
関数オブジェクトバインダー(bind)–任意のパラメーターパラメーターを関数オブジェクトにバインドできます。関数の合成も許可されます。これは、標準関数std::bind1stとstd::bind2ndバインド関数の一般化されたバージョンです。この機能は、BoostBindライブラリに基づいています。
関数の戻りタイプ(result_of)–呼び出し式のタイプを決定します。
メンバー関数(mem_fn)–標準std::mem_funおよびstd::mem_fun_ref。の拡張。メンバー関数へのポインターを関数オブジェクトとして扱うことができます。Boost MemFnライブラリに基づいています。

メタプログラミングとタイプ特性
今そこにあるなど、多くの有用な形質メタテンプレート、含まれているヘッダファイルis_pod、has_virtual_destructor、remove_extentそれは別の間でクエリや変換を可能にすることにより、メタプログラミングを容易、などの種類が。この提案は、Boost TypeTraitsライブラリに基づいています。

数値設備

乱数の生成
新しいヘッダファイル- 、variate_generator、mersenne_twister、poisson_distributionなど
いくつかの疑似乱数ジェネレータ、エンジン、および確率分布のいずれかを使用して乱数を生成するためのユーティリティ

数学的特殊関数
数学的な特殊関数や特定のC99の追加など、TR1の一部の機能は、TR1のVisual C ++実装には含まれ数学特殊関数ライブラリは、C ++ 11では標準化されていませんでした。
追加/ -ヘッダファイルbeta、legendreなど
これらの機能は、工学および科学分野のプログラマーにとって主な関心事となる可能性が
次の表は、TR1で説明されている23の特殊機能すべてを示しています。
関数名
関数プロトタイプ
数式
関連するラゲールの多項式 double assoc_laguerre(unsigned n、unsigned m、double x);L n m ( X )。 = (( −
1)。 m dm dX m L n + m ( X )。 にとって X≥ 0
{ {L_ {n}} ^ {m}(x)=(-1)^ {m} { frac {d ^ {m}} {dx ^ {m}}} L_ {n + m}( x)、{ text {for}} x geq 0}
 
ルジャンドル陪多項式 double assoc_legendre(unsigned l、unsigned m、double x);P l m ( X )。 = (( 1−X 2
)。 m /2 m dX m P l ( X )。 にとって X≥ 0
{ {P_ {l}} ^ {m}(x)=(1-x ^ {2})^ {m / 2} { frac {d ^ {m}} {dx ^ {m}}} P_ {l}(x)、{ text {for}} x geq 0}
 
ベータ関数 二重ベータ(二重x、二重y); B (( X y
)。= Γ(( X
)。 Γ (( y
)。 Γ (( X+ y )。 { mathrm {B}(x、y)= { frac { Gamma(x) Gamma(y)} { Gamma(x + y)}}}
 
第1種の完全楕円積分 double comp_ellint_1(double k); K (( k
)。= F(( k π
2)。= 0π 2 d θ
1− k 2 sin 2 θ
{ 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}}}}
 
第2種の完全楕円積分 double comp_ellint_2(double k); E (( k π
2)。 = 0 π2 1
− 2sin 2 θ d θ
{ E left(k、 textstyle { frac { pi} {2}} right)= int _ {0} ^ { frac { pi} {2}} { sqrt {1- k ^ {2} sin ^ {2} theta}} ; d theta}
 
第3種の完全楕円積分 double comp_ellint_3(double k、double nu); Π (( ν k π
2)。= 0π 2 d θ(( 1− ν sin 2 θ
)。 1 − sin2 θ
{ 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
)。= Γ(( c
)。 Γ (( a )。 ∑n = 0 ∞ Γ(( a+ n
)。Xn Γ(( c+ n
)。n !
{ F(a、c、x)= { frac { Gamma(c)} { Gamma(a)}} sum _ {n = 0} ^ { infty} { frac { Gamma( a + n)x ^ {n}} {ガンマ(c + n)n!}}}
 
通常の修正された円筒ベッセル関数 double cyl_bessel_i(double nu、double x);I ν(( X
)。 = I − νJ ν(( 私X
)。 = ∑k = 0 ∞(( X/ 2
)。ν + 2 k k ! Γ(( ν+ k + 1
)。 にとって X≥ 0
{ 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 geq 0}
 
第1種の円筒ベッセル関数 double cyl_bessel_j(double nu、double x);J ν(( X
)。 = ∑k = 0 ∞(( − 1 )。 k (( X/ 2
)。ν + 2 k k ! Γ(( ν+ k + 1
)。 にとって X≥ 0
{ J _ { nu}(x)= sum _ {k = 0} ^ { infty} { frac {(-1)^ {k} ;(x / 2)^ { nu + 2k }} {k!; Gamma( nu + k + 1)}}、{ text {for}} x geq 0}
 
不規則に修正された円筒ベッセル関数 double cyl_bessel_k(double nu、double x);K ν(( X )。 =π 2 I + 1 (( J ν (( 私X
)。+ I N ν (( 私X )。 )。 = {{I − ν(( X
)。− I ν(( X )。 sin ν
π にとって X≥ 0
 と ν ∉ Z π 2
リムμ ν I − μ(( X
)。− I μ(( X )。 sin μ
π にとって X< 0
 と ν ∈ Z
{ { begin {aligned} K _ { nu}(x)&= textstyle { frac { pi} {2}} i ^ { nu +1} { big(} J _ { nu} (ix)+ iN _ { nu}(ix){ big)} \&= { begin {cases} { frac {I _ {- nu}(x)-I _ { nu}(x )} { sin nu pi}}、&{ text {for}} x geq 0 { text {and}} nu notin mathbb {Z} \ { 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 {aligned}}}
 
円筒形ノイマン関数 第2種の円筒ベッセル関数
double cyl_neumann(double nu、double x);N ν(( X
)。 = {{
J ν (( X
)。 cos νπ − J − ν(( X
)。 sinν π にとって X≥ 0
 と ν ∉ Z リム μ νJ μ(( X
)。 cos μπ − J − μ(( X
)。 sinμ π にとって X< 0
 と ν ∈ Z { N _ { nu}(x)= { begin {cases} { frac {J _ { nu}(x) cos nu pi -J _ {- nu}(x)} { sin nu pi}}、&{ text {for}} x geq 0 { text {and}} nu notin mathbb {Z} \ 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}}}
 
第1種の不完全楕円積分 double ellint_1(double k、double phi); F (( k ϕ )。 = 0ϕ d θ
1− k 2 sin 2
θ にとって 
|k | ≤ 1
{ F(k、 phi)= int _ {0} ^ { phi} { frac {d theta} { sqrt {1-k ^ {2} sin ^ {2} theta} }}、{ text {for}} left | k right | leq 1}
 
第2種の不完全楕円積分 double ellint_2(double k、double phi); E (( k ϕ
)。= ∫
0 ϕ 1− k 2 sin 2 θ d
θ  にとって | k | ≤ 1
{ displaystyle E(k、 phi)= int _ {0} ^ { phi} { sqrt {1-k ^ {2} sin ^ {2} theta}} d theta、{ text {for}} left | k right | leq 1}
 
第3種の不完全楕円積分 double ellint_3(double k、double nu、double phi); Π (( k ν ϕ )。 = 0ϕ d θ(( 1− ν in2 θ
)。 1 − sin2 θ にとって 
|k | ≤ 1
{ 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 | leq 1}
 
指数積分 double expint(double x); E I(( X
)。= − ∫ −
X∞ e − t t d t
{ { mbox {E}} i(x)=- int _ {-x} ^ { infty} { frac {e ^ {-t}} {t}} 、dt}
 
エルミート多項式 ダブルエルミート(符号なしn、ダブルx);H n ( X )。 = (( −
1)。n eX 2 d n dX n e
− 2
{ 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
)。= Γ(( c
)。 Γ (( a
)。 Γ (( b )。 ∑n = 0 ∞ Γ(( a+ n
)。 Γ (( b+ n
)。 Γ (( c+ n
)。Xn n !
{ 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 )。= eX n ! d n dX n(( Xn e −X
)。 にとって X≥ 0
{ L_ {n}(x)= { frac {e ^ {x}} {n!}} { frac {d ^ {n}} {dx ^ {n}}} left(x ^ { n} e ^ {-x} right)、{ text {for}} x geq 0}
 
ルジャンドル多項式 double legendre(unsigned l、double x);P l ( X )。=1 2 l l! d l dX l((X2
1)。
l にとって X | ≤ 1
{ P_ {l}(x)= {1 over 2 ^ {l} l!} {d ^ {l} over dx ^ {l}}(x ^ {2} -1)^ {l} 、{ text {for}} left | x right | leq 1}
 
リーマンゼータ関数 double riemann_zeta(double x); Z (( X
)。 = {{
∑k = 1 ∞ k −
X にとって X
>>1 2X πX − 1 sin (( Xπ 2
)。 Γ (( 1 −X )。 ζ (( 1 −X )。 にとって X< 1
{ mathrm {Z}(x)= { begin {cases} sum _ {k = 1} ^ { infty} k ^ {-x}、&{ text {for}} x> 1 \ 2 ^ {x} pi ^ {x-1} sin left({ frac {x pi} {2}} right) Gamma(1-x) zeta (1-x)、&{ text {for}} x <1 \ end {cases}}}
1\ 2^{x}pi ^{x-1}sin left({frac {xpi }{2}}right)Gamma (1-x)zeta (1-x),&{text{for }}x<1\end{cases}}"">  
第1種の球状ベッセル関数 double sph_bessel(unsigned n、double x);j n ( X )。= π 2X
Jn + 1 / 2 ( X )。 にとって X≥ 0
{ j_ {n}(x)= { sqrt { frac { pi} {2x}}} J_ {n + 1/2}(x)、{ text {for}} x geq 0}
 
球形のルジャンドル陪関数 double sph_legendre(unsigned l、unsigned m、double theta);Y l m(( θ 0 )。  どこ  Yl m (( θ ϕ
)。 = (( −
1)。 m [ (( 2l + 1
)。4 π(( l− m
)。 ! (( l+ m
)。 ! ]1 2 l m(( cos θ )。 eI m ϕ にとって 
| m |≤ l
{ Y_ {l} ^ {m}( theta、0){ text {where}} Y_ {l} ^ {m}( theta、 phi)=(-1)^ {m} left [{ frac {(2l + 1)} {4 pi}} { frac {(lm)!} {(l + m)!}} right] ^ {1 over 2} P_ {l} ^ {m}( cos theta)e ^ { mathrm {i} m phi}、{ text {for}} | m | leq l}
 
球面ノイマン関数 第2種の球状ベッセル関数
double sph_neumann(unsigned n、double x);n n ( X )。 = (( π 2X )。1 2 n +1 2(( X
)。 にとって X≥ 0
{ n_ {n}(x)= left({ frac { pi} {2x}} right)^ { frac {1} {2}} N_ {n + { frac {1} {2 }}}(x)、{ text {for}} x geq 0}
 
各関数には、さらに2つのバリアントが関数名に接尾辞「f」または「l」を追加するとfloat、long doubleそれぞれまたは値を操作する関数が得られます。例えば:
float sph_neumannf (unsigned n 、float x );
long double sph_neumannl (unsigned n 、long double x );

コンテナ

タプルタイプ
新しいヘッダーファイル–tuple
BoostTupleライブラリに基づく
漠然と標準の拡張 std::pair
さまざまなタイプの要素の固定サイズのコレクション

固定サイズの配列
新しいヘッダーファイル–array
BoostArrayライブラリから取得
標準などの動的配列タイプとは対照的に std::vector

ハッシュテーブル
新しい、ヘッダーファイル
彼らは、実装unordered_set、unordered_multiset、unordered_map、およびunordered_multimapに類似したクラスを、set、multiset、map、およびmultimapそれぞれ、
残念ながら、unordered_setとunordered_multiset一緒に使用することはできませんset_union、set_intersection、set_difference、set_symmetric_difference、およびincludes標準ライブラリ関数、仕事用setとmultiset
既存のライブラリから派生していない、既存のライブラリと完全にAPI互換ではない新しい実装
すべてのハッシュテーブルと同様に、要素の定数時間ルックアップを提供することがよくありますが、最悪の場合はコンテナのサイズが線形になる可能性があります

正規表現
新しいヘッダファイル- 、regex、regex_match、regex_search、regex_replaceなど
BoostRegExライブラリに基づく
パターンマッチングライブラリ

C互換性
C ++は、Cプログラミング言語と互換性があるように設計されていますが、標準が異なるため、Cの厳密なスーパーセットではありません。TR1は、などのC ++ライブラリのさまざまなヘッダーに追加することで、これらの違いの一部を調整しようとします。これらの変更は、C ++をCのC99バージョンとより一致させるのに役立ちます。標準(C99のすべての部分がTR1に含まれているわけではありません)。

テクニカルレポート2
2005年に、TR2の提案依頼書が作成され、Unicode、XML / HTML、ネットワーキング、および初心者プログラマーの使いやすさに特別な関心が寄せられました。TR2は提案を求めます。
いくつかの提案が含まれています:
スレッド
ASIO C ++ライブラリ(ネットワーキング )。
シグナル/スロット[ C ++ライブラリTR2での標準化に関するsigc提案]
ファイルシステムライブラリTR2用のファイルシステムライブラリ– Boostファイルシステムライブラリに基づいており、パス、ファイル、およびディレクトリのクエリ/操作を行います。
TR2の任意のライブラリ任意のライブラリ提案を後押し
字句変換ライブラリTR2の変換ライブラリ提案
新しい文字列アルゴリズムのTR2で新しい文字列アルゴリズムの提案
TR2 ISO / IEC JTC1 / SC22 / WG21の数値ライブラリの代数プロパティのより完全な分類に向けて-論文2008
TR2の連想コンテナに異種比較ルックアップを追加する
TR2の提案を求める声が出された後、ISOの手順が変更されたため、TR2はありません。代わりに、C ++の拡張機能は、いくつかの技術仕様で公開されます。上記の提案の一部は、C ++標準または技術仕様のドラフトバージョンにすでに含まれています。

も参照してください
C ++ 11、C ++プログラミング言語の標準。ライブラリの改善はTR1に基づいていました
C11(C標準リビジョン)、Cプログラミング言語の最新の標準
Boostライブラリ、ポータブルC ++ライブラリの大規模なコレクション、そのうちのいくつかはTR1に含まれていました
標準テンプレートライブラリ、現在のC ++標準ライブラリの一部

参考文献
^ “”ref-1.72.0″”。www.boost.org。
^ “”Boost.SmartPtr:スマートポインタライブラリ-1.72.0″”。www.boost.org。
^ 「第16章Boost.Function-1.72.0」。www.boost.org。
^ 「第1章Boost.Bind-1.72.0」。www.boost.org。
^ 「第1章Boost.Member関数-1.72.0」。www.boost.org。
^ 「第1章Boost.TypeTraits-1.37.0」。www.boost.org。
^ 「ブーストタプルライブラリ–ブースト1.48.0」。
^ 「第5章Boost.Array-1.72.0」。www.boost.org。
^ “”Boost.Regex-1.36.0″。www.boost.org。

ソース
ISO / IEC JTC1 / SC22 / WG21 — C ++ライブラリ拡張に関するテクニカルレポートのドラフト (PDF)(レポート)。2005-06-24。
ISO / IEC TR 19768:2007 —情報技術—プログラミング言語— C ++ライブラリ拡張に関するテクニカルレポート(レポート)。2007年11月。
ベッカー、ピーター(2006)。C ++標準ライブラリ拡張機能:チュートリアルとリファレンス。アディソン-ウェスリープロフェッショナル。ISBN 0-321-41299-0。

外部リンク
ScottMeyersの効果的なC ++:TR1情報–TR1ライブラリの背景と理論的根拠を提供するTR1提案文書へのリンクが含まれています。”