導入
C++1x (以前はC++0xとして知られていました) は、コンピューティングにおける C++ 言語の新しい標準として計画されています。これは、1998 年に発行され 2003 年に更新された既存の標準である ISO/IEC 14882 を置き換えることを目的としています。後者は、C++98 および C++03 という非公式の名前でよく知られています。新しい標準では、初期言語にいくつかの新機能が導入されるほか、特殊な数学関数ライブラリを除く、「テクニカルレポート 1」のほとんどのライブラリと同様に C++標準ライブラリにも新機能が導入されます。この標準は現在最終決定されていないため、この記事は ISO C++ 標準委員会サイトで公開されている C++1x の現在の状況を反映していない可能性があります。最新のレポート N2597 は 2008 年 5 月に発行されました。
ISO/IEC JTC1/SC22/WG21 C++ 標準委員会は、2009 年に新しい標準を導入することを目指しています (したがって、現在 C++1x と呼ばれている標準は C++09 と呼ばれます)。これは、文書が次の機関によって批准される準備ができていなければならないことを意味します。期限内に終了するために、委員会は 2006 年までに作成された解決策に努力を集中し、新しい提案はすべて無視することを決定しました。
C++ のような プログラミング言語は進化しており、プログラマーはより高速かつエレガントにコードを作成し、保守可能なコードを生成できるようになります。このプロセスでは必然的に、C++ 開発プロセス中に時々生じる既存のコードとの互換性の問題が生じます。しかし、 Bjarne Stroustrup (C++ 言語の発明者で委員会メンバー) の発表によると、新しい標準は現在の標準とほぼ 100% 互換性があるとのことです。

標準のアップデートで予定されている変更点
前述したように、C++ 言語への変更は、初期言語と標準ライブラリの両方に配置されます。
新しい規格の各機能の開発中に、委員会は次のガイドラインを適用しました。
- C++98、および可能であればCとの安定性と互換性を維持します。
- 言語自体を通じてではなく、標準ライブラリを通じて新機能を導入することを好みます。
- プログラミング技術を改善できる変更を優先します。
- 特定のアプリケーションにのみ役立つ新機能を導入するのではなく、C++ を改善してシステムやライブラリの構築を容易にします。
- 現在の、むしろ安全ではないものに対して、より安全な代替手段を提供することで、型の保護を強化します。
- パフォーマンスとハードウェアを直接操作する機能が向上します。
- 現在の問題に対する具体的な解決策を提案します。
- 「ゼロオーバーヘッド」原則を実装します。
- 専門プログラマが必要とする機能を削除することなく、C++ を学習し、指導しやすくします。
標準ライブラリの拡張
スレッドの改善
タプルの型
タプルは、さまざまなタイプのオブジェクトの固定次元コレクションです。すべてのタイプのオブジェクトをタプルの要素にすることができます。この新しい機能は新しいヘッダーに実装されており、次のような C++1x 拡張機能の恩恵を受けます。
- 参照に参照を追加
- テンプレート関数のデフォルトの引数
tupleテンプレート化されたクラスの定義は次のとおりです。
テンプレート<クラス...タイプ>クラスタプル;
tuple型の定義と使用の例:
typedefタプル< int 、 double 、 long & 、 const char * > test_tuple ;長い長い= 12 ; test_tuple 証明( 18 , 6.5 , 長い, "Ciao!" ) ; lengthy = get < 0 > (証明) ; // 'longy' を 18 に設定します。 get < 3 > ( proof ) = "美しい!" ; // タプルの 4 番目の値を変更します
タプルの要素にデフォルトのコンストラクターがある場合、その内容を定義せずにproofタプルを作成することができます。さらに、タプルを別のタプルに割り当てることができます。2 つのタプルが同じ型の場合、タプルの各要素がコピーごとにコンストラクタを持つ必要があります。それ以外の場合は、タプルの各要素の型が同じである必要があります。タプル ‘ 右オペランドが左オペランドの対応する型と互換性があるか、左オペランドの対応する要素に適切なコンストラクターがあること。
typedefタプル< int 、 double 、 string > tuple_1 t1 ; typedefタプル< char , short , const char * > tuple_2 t2 ( 'X' , 2 , "Hola!" ) ; t1 = t2 ; // わかりました。最初の 2 つの要素は変換できます。 // 3 番目の要素は 'const char *' から構築できます。
関係演算子が使用可能です (同じ数の要素を持つタプルの場合)。タプルの特性を (コンパイル時に) チェックするために 2 つの式が導入されています。
-
tuple_size ::value タプルtuple_size ::valueTの要素の数を返します。 -
tuple_element ::typetuple_element ::typeタプルTの位置Iに配置されたオブジェクトのタイプを返します。

ハッシュテーブル
ハッシュ テーブル (順序付けされていない連想コンテナ) を C++ 標準ライブラリに統合することは、最も繰り返し行われるリクエストの 1 つです。これは、時間の制約により、現在の規格 (1995 年に作成され 1998 年に承認された規格) では行われていませんでした。このソリューションは、最悪の場合 (大規模な衝突の場合) にはバランス ツリーよりも効率が劣りますが、それでも、ほとんどの現実世界のアプリケーションでは最適です。
委員会は、(特に要素の削除が許可されている場合に) 多数の本質的な問題を引き起こすオープン アドレッシング ソリューションを標準化することは適切ではないと考えているため、衝突は線形連鎖によってのみ処理されます。独自のハッシュ テーブル実装を持つ非標準ライブラリとの名前の競合を避けるために、 hashの代わりに接頭辞unorderedを使用します。
この新機能では、同じキーの要素 (一意のキーまたは同等のキー) を受け入れるかどうか、および各キーを関連する値に関連付けるかどうかによって異なる 4 種類のハッシュ テーブルが統合されます。
| ハッシュテーブルの種類 | 任意の関連型 | 同等のキー |
|---|---|---|
| 順序なしセット | ||
| unowned_multiset | • | |
| 順序なしマップ | • | |
| unowned_multimap | • | • |
これらの新しいクラスは、コンテナ クラスのすべてのリクエストを満たし、要素にアクセスするために必要なすべてのメソッドinsert 、 erase 、 begin 、 endを含みます。
これらのクラスは C++ 言語の新しい拡張を必要としませんでしたが、ヘッダーをわずかに拡張するだけで済みました。
正規表現
一般的な「スマートポインター」
拡張可能な乱数の改善
標準 C ライブラリでは、 rand関数を使用して擬似乱数を生成できます。生成アルゴリズムは標準化されておらず、ライブラリのサプライヤーの選択に任されています。 C++ には何も変更はありませんが、C++1x では疑似乱数を生成する別の方法が提供されます。
この機能は、乱数生成オブジェクトを形成する 2 つの部分に分かれています。
C++1x では 3 つの生成アルゴリズムが定義されており、それぞれに長所と短所があります。
| テンプレート | 整数/浮動小数点 | 品質 | スピード | 状態サイズ |
|---|---|---|---|---|
linear_congruential | 全体 | 平均 | 平均 | 1 |
subtract_with_carry | 両方 | 平均 | 速い | 25 |
mersenne_twister | 全体 | 良い | 速い | 624 |
C++1x は、 uniform_int_distribution 、 bernoulli_distribution 、 geometric_distribution 、 poisson_distribution 、 binomial_distribution 、 uniform_real_distribution 、 exponential_distribution 、 normal_distribution 、 gamma_distributionなどの標準分布を多数提供します。
ジェネレーターとディストリビューションは、次の例のように結合されます。
std :: uniform_int_distribution <int>分布( 0.99 ) ; std :: mt19937エンジン;自動ジェネレーター= std ::バインド(ディストリビューション、エンジン) ; intランダム=ジェネレーター( ) ; // 0 ~ 99 の間の一様積分変量を生成します。
特殊な数学関数
ヘッダーファイルはすでにいくつかの一般的な数学関数を定義しています。
- 三角関数:
sin、cos、tan、asin、acos、atan、atan2; - 双曲線:
sinh、cosh、tanh、asinh、acosh、atanh; - 指数関数:
exp、exp2、frexp、ldexp、expm1; - 対数:
log10、log2、logb、ilogb、log1p; - べき乗:
pow、sqrt、cbrt、hypot; - 特殊:
erf、erfc、tgamma、lgamma。
委員会は、現在非標準ライブラリの使用を必要とする新しい関数を追加することを決定しました。これらの新しい機能は、主に科学分野のプログラマやエンジニアリングにとって興味深いものとなるでしょう。
次の表は、TR1 に記述されている 23 の関数を示しています。
| 関数名 | 関数プロトタイプ | 数学的表現 |
|---|---|---|
| 一般化ラゲール多項式 | double assoc_laguerre (符号なし n、符号なし m、double x); | $$ {{L_n}^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n+m}(x), \text{ pour } x \ge 0} $$ |
| 一般化ルジャンドル多項式 | double assoc_legendre (符号なし l、符号なし m、double x); | $$ {{P_l}^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m} P_l(x), \text{ pour } x \ge 0} $$ |
| ベータ関数 | ダブルベータ(ダブル x、ダブル y); | $$ {B(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}} $$ |
| 第一種完全楕円積分 | ダブルcomp_ellint_1 (ダブル 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}}} $$ |
| 第 2 種完全楕円積分 | ダブルcomp_ellint_2 (ダブル k ); | $$ {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); | $$ {\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 (ダブル a、ダブル c、ダブル 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 (ダブルベア、ダブル x); | $$ {I_\nu(x) = i^{-\nu} J_\nu(ix) = \sum_{k = 0}^\infty \frac{(x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ pour } x \ge 0} $$ |
| 第一種円筒ベッセル関数 | double cyl_bessel_j (ダブルベア、ダブル x); | $$ {J_\nu(x) = \sum_{k = 0}^\infty \frac{(-1)^k \; (x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ pour } x \ge 0} $$ |
| 不規則修正円筒ベッセル関数 | double cyl_bessel_k (ダブルベア、ダブル 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{ pour } x \ge 0 \text{ et } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \frac{\pi}{2} \lim_{\mu \to \nu} \frac{I_{-\mu}(x) – I_\mu(x)}{\sin \mu\pi}, & \text{ pour } x < 0 \text{ et } \nu \in \mathbb{Z} \\ \end{cases} \end{align}} $$ |
| 円筒ノイマン関数 第 2 種円筒ベッセル関数 | double cyl_neumann (ダブルネイキッド、ダブル x); | $$ { N_\nu(x) = \begin{cases} \displaystyle \frac{J_\nu(x)\cos \nu\pi – J_{-\nu}(x)}{\sin \nu\pi}, & \text{ pour } x \ge 0 \text{ et } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \lim_{\mu \to \nu} \frac{J_\mu(x)\cos \mu\pi – J_{-\mu}(x)}{\sin \mu\pi}, & \text{ pour } x < 0 \text{ et } \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{ pour } \left|k\right| \le 1} $$ |
| 第 2 種不完全楕円積分 | double ellint_2 (ダブル k、ダブル ファイ); | $$ {\displaystyle E(k,\phi)=\int_0^\phi\sqrt{1-k^2\sin^2\theta}d\theta, \text{ pour } \left|k\right| \le 1} $$ |
| 第 3 種不完全楕円積分 | double ellint_3 (ダブル k、ダブル nu、ダブル ファイ); | $$ {\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{ pour } \left|k\right| \le 1} $$ |
| 指数積分 | ダブルエクスプリント(ダブル x); | $$ { \mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt} $$ |
| エルミート多項式 | ダブル隠者(符号なし n、ダブル x); | $$ {H_n(x)=(-1)^n e^{x^2}\frac{d^n}{dx^n}e^{-x^2}\,\!} $$ |
| 超幾何級数 | ダブルハイパーg (ダブルa、ダブルb、ダブルc、ダブル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!}} $$ |
| ラゲール多項式 | ダブルラゲール(符号なし n、ダブル x); | $$ {L_n(x)=\frac{e^x}{n!}\frac{d^n}{dx^n}\left(x^n e^{-x}\right), \text{ pour } x \ge 0} $$ |
| ルジャンドル多項式 | double legendre (符号なし l、double x); | $$ {P_l(x) = {1 \over 2^l l!} {d^l \over dx^l } (x^2 -1)^l, \text{ pour } \left|x\right| \le 1 } $$ |
| リーマンゼータ関数 | ダブルリーマンゼータ(ダブル x); | |
| 第一種球面ベッセル関数 | double sph_bessel (符号なし n、double x); | $$ {j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x), \text{ pour } x \ge 0} $$ |
| 一般化された球面ルジャンドル関数 | double sph_legendre (符号なし l、符号なし m、ダブル シータ); | $$ { Y_{l}^{m}(\theta, 0) \text{ avec } 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^{im\phi} \text{ pour } |m| \leq l} $$ |
| 球面ノイマン関数 第 2 種球面ベッセル関数 | double sph_neumann (符号なし n、double x); | $$ { n_{n}(x) = \sqrt{\frac{\pi}{2x}} N_{n+1/2}(x) \text{ pour } 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 ) ;

