C++_Technical_Report_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
d m dXm 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 − X2 ) m / 2d m dXm 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 − k 2 sin 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 − k2 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 )X n Γ (( 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); 私 ν
(( X ) =
私− ν 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 私ν + 1
(( J ν (( 私X) + 私 Nν
(( 私X) ) = {{私 − ν (( X) − 私 ν (( X ) sin ν
π ために X ≥ 0
 そして  ν ∉
Z π 2
リムμ → ν 私 − μ (( X) − 私 μ (( 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 { 画像注釈 画像注釈 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 − ν sin2 θ)1 − k2 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 私
(( X) = −∫ −X ∞
e− t t d t { 画像注釈 { mbox {E}} i(x)=- int _ {-x} ^ { infty} { frac {e ^ {-t}} {t}} 、dt}
 
エルミート多項式 ダブルエルマイト(unsigned n、double x); H n
(( X ) =
(( − 1) n
eX2 d n dX n e −X 2
{ 画像注釈 H_ {n}(x)=(-1)^ {n} e ^ {x ^ {2}} { frac {d ^ {n}} {dx ^ {n}}} e ^ {- x ^ {2}} 、!}
 
超幾何シリーズ ダブルhyperg(ダブルa、ダブルb、ダブルc、ダブル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 ) =
eXn ! d n dX n (( X n 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 ll! d l dX l ((X 2 − 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}
 
リーマンゼータ関数 ダブルリーマンゼータ(ダブル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種の球面ベッセル関数 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 )  どこ 
Y l m
(( θ ϕ ) =
(( − 1) m [ (( 2l + 1 ) 4 π (( l− m ) ! (( l+ m ) ! ] 1 2P l m
(( cos θ )
e 私 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 2Nn + 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 ++標準ライブラリの一部
参考文献
^ “参照-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」。2006年5月26日にオリジナルからアーカイブされました。
^ 「第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。
外部リンク
スコットマイヤーズの効果的なC ++:TR1情報–TR1ライブラリの背景と理論的根拠を提供するTR1提案文書へのリンクが含まれています。

投稿日:
カテゴリー: C