プログラミング/C++/C++11 既存ライブラリ変更点/数値処理 の変更点


C++03規格時点で存在した数値処理関連ライブラリに対するC++11規格での変更点をまとめています。

#contents

*概要 [#about]

当文書では、数値を表現するクラスや数値演算を行う関数等を提供するヘッダファイル群について、C++11規格での変更点をまとめている。

ここでは詳しく取り上げないが、数値に関する主要な新規機能としては下記のようなものがある。

:@code{long long int};|64ビット以上であることが規定されている整数型。
:<chrono>|新しい時間ライブラリ。
:<random>|新しい乱数ライブラリ。
:<ratio>|分数定数値クラス @code{ratio}; と、それを用いた単位型(@code{milli}; や @code{kilo}; 等)の定義。
:<cstdint>|バイト幅が明示された整数型(@code{int32_t}; や @code{uint64_t}; 等)の定義。

*<bitset> [#bitset]

**bitset クラステンプレート [#bitset-bitset]

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// すべてのビットが 1 であるか否かを取得する。
bool all() const noexcept;
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 現在のビット状態と等価な unsigned long long 値を作成する。
// unsigned long long で表せないビット数の場合は overflow_error 例外が送出される。
unsigned long long to_ullong() const;
}}
-~コンストラクタの定義が変更された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++03
bitset();
bitset(unsigned long src);
template<class CharT, class Traits, class Alloc> explicit bitset(
    const basic_string<CharT, Traits, Alloc>& src,
    typename basic_string<CharT, Traits, Alloc>::size_type pos = 0,
    typename basic_string<CharT, Traits, Alloc>::size_type size =
        basic_string<CharT, Traits, Alloc>::npos);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++11

// constexpr が付き、コンパイル時定数として利用可能になった。
constexpr bitset() noexcept;
constexpr bitset(unsigned long long src) noexcept;

// ビット 0 と 1 をそれぞれどの文字で表現するか指定可能になった。
template<class CharT, class Traits, class Alloc> explicit bitset(
    const basic_string<CharT, Traits, Alloc>& src,
    typename basic_string<CharT, Traits, Alloc>::size_type pos = 0,
    typename basic_string<CharT, Traits, Alloc>::size_type size =
        basic_string<CharT, Traits, Alloc>::npos,
    CharT zero = CharT('0'),
    CharT one = CharT('1'));
template<class CharT> explicit bitset(
    const CharT* src,
    typename basic_string<CharT>::size_type size = basic_string<CharT>::npos,
    CharT zero = CharT('0'),
    CharT one = CharT('1'));
}}
-~メンバ関数 @code{size}; が @code{constexpr}; 関数に変更され、戻り値をコンパイル時定数として利用可能になった。
-~下記のメンバ関数に条件式なしの @code{noexcept}; 指定が付与され、例外を投げないことが保証された。
--@code{count};
--@code{size};
--@code{any};
--@code{none};
--@code{set}; (引数なしのオーバロードのみ)
--@code{reset}; (引数なしのオーバロードのみ)
--@code{flip}; (引数なしのオーバロードのみ)
--@code{operator~};
--@code{operator==};
--@code{operator!=};
--@code{operator<<};
--@code{operator>>};
--@code{operator&=};
--@code{operator|=};
--@code{operator^=};
--@code{operator<<=};
--@code{operator>>=};
-~メンバ型 @code{reference}; のコンストラクタおよび全メンバ関数に条件式なしの @code{noexcept}; 指定が付与され、例外を投げないことが保証された。

**<bitset> その他 [#bitset-others]

-~下記のフリー関数の @code{bitset}; を引数にとるオーバロードに条件式なしの @code{noexcept}; 指定が付与され、例外を投げないことが保証された。
--@code{operator&};
--@code{operator|};
--@code{operator^};
-~クラステンプレート @code{hash}; ([[&lt;functional&gt;>../アルゴリズム#functional]])の部分特殊化バージョンが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<size_t N> struct hash<bitset<N>>;
}}

*<complex> [#complex]

**complex クラステンプレート [#cmplex-cmplex]

-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
void imag(value_type value);
void real(value_type value);
}}
-~すべてのコンストラクタの定義に @code{constexpr}; が付き、コンパイル時定数として利用可能になった。

**<complex> その他 [#complex-others]

文中で型名が @code{arithmetric}; となっているものは次の規則に従って型が定まる。

+いずれかの引数の型が @code{long double}; または @code{complex<long double>}; ならば @code{long double}; 。
+いずれかの引数の型が @code{double}; 、 @code{complex<double>}; 、または整数型(@code{int}; 等)ならば @code{double}; 。
+いずれかの引数の型が @code{float}; または @code{complex<float>}; ならば @code{float}; 。
+上記以外ならば未定義。(コンパイルエラー)

-~下記のフリー関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 複素射影直線(リーマン球面への射影)を取得する。
// 実数部も虚数部も正負の無限大(infinity)ではないならば引数値をそのまま返す。
// 実数部または虚数部が正負の無限大ならば、
// 実数部が正の無限大、虚数部が 0.0 または -0.0 である値を返す。
// 戻り値の虚数部の符号は、引数値の虚数部の符号と同一になる。
template<class T> complex<T> proj(const complex<T>& value);
complex<float> proj(float value);
complex<long double> proj(long double value);
template<class IntegerOrDouble> complex<double> proj(IntegerOrDouble value);
}}
-~下記のフリー関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 実数部を引数値そのもの、虚数部を 0 の複素数値として扱うオーバロード群。
template<class ArithType> arithmetric real(ArithType value);
template<class ArithType> arithmetric imag(ArithType value);
template<class ArithType> arithmetric arg(ArithType value);
template<class ArithType> arithmetric norm(ArithType value);
template<class ArithType> complex<arithmetric> conj(ArithType value);

// <cmath> に定義されている関数の complex 版。
template<class T> complex<T> acos(const complex<T>& x);
template<class T> complex<T> acosh(const complex<T>& x);
template<class T> complex<T> asin(const complex<T>& x);
template<class T> complex<T> asinh(const complex<T>& x);
template<class T> complex<T> atan(const complex<T>& x);
template<class T> complex<T> atanh(const complex<T>& x);
}}
-~フリー関数 @code{pow}; の一部オーバロードが削除され、新しいオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++03
template<class T> complex<T> pow(const complex<T>& x, int y);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++11
template<class T, class U>
complex<arithmetric> pow(const complex<T>& x, const complex<U>& y);
template<class T, class U>
complex<arithmetric> pow(const complex<T>& x, const U& y);
template<class T, class U>
complex<arithmetric> pow(const T& x, const complex<U>& y);
}}

*<limits> [#limits]

**numeric_limits クラステンプレート [#limits-numeric_limits]

-~下記の特殊化バージョンが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class T> class numeric_limits<char16_t>;
template<class T> class numeric_limits<char32_t>;
template<class T> class numeric_limits<long long>;
template<class T> class numeric_limits<unsigned long long>;
}}
-~下記の静的メンバ定数および静的メンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 整数型バージョンでは 0 が設定される。
// 実数型バージョンでは floor(digits * log10(2) + 2) 相当の値が設定される。
static constexpr int max_digits10;
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 整数型バージョンでは min() と等価な値を返す。
// 実数型バージョンでは -max() と等価な値を返す。
static constexpr T lowest();
}}
-~すべての静的メンバ定数および静的メンバ関数の定義に @code{constexpr}; が付き、コンパイル時定数として利用可能になった。

*<numeric> [#numeric]

-~下記の関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// コンテナ範囲の各要素に、 value から始まり、
// 1要素ごとに ++value によってインクリメントした値を設定する。
template<class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value);
}}

*<valarray> [#valarray]

**valarray クラステンプレート [#valarray-valarray]

-~下記のコンストラクタが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
valarray(valarray&& src) noexcept;
valarray(initializer_list<value_type> values);
}}
-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの valarray 間で内容を入れ替える。
void swap(valarray& other) noexcept;
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
valarray& operator=(valarray&& src) noexcept;
}}
-~メンバ関数 @code{operator[]}; の一部オーバロードの定義が変更された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++03
value_type operator[](size_t index) const;
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++11
// 戻り値が value_type から const value_type& に変更
const value_type& operator[](size_t index) const;
}}

**<valarray> その他 [#valarray-others]

-~クラステンプレート @code{slice_array}; 、 @code{gslice_array}; 、 @code{mask_array}; 、 @code{indirect_array}; が下記のように変更された。
--引数なしのコンストラクタが @code{private}; 宣言から @code{public}; の @code{delete}; 指定になった。
--コピーコンストラクタおよびコピー代入演算子が定義され、コピー可能になった。
--メンバ関数 @code{operator=(const value_type&)}; が @code{const}; 修飾された。(@code{indirect_array}; を除く)
-~フリー関数 @code{begin}; および @code{end}; ([[&lt;iterator&gt;>../アルゴリズム#iterator]])のオーバロードが定義された。~
戻り値の型 @code{unspecified}; はコンパイラ依存の @code{RandomAccessIterator}; である。
戻り値の型 @code{unspecified}; は処理系依存の @code{RandomAccessIterator}; である。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class T> unspecified begin(valarray<T>& c);
template<class T> unspecified begin(const valarray<T>& c);
template<class T> unspecified end(valarray<T>& c);
template<class T> unspecified end(const valarray<T>& c);
}}
-~フリー関数 @code{swap}; ([[&lt;utility&gt;>../ユーティリティ#utility]])のオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class T>
void swap(valarray<T>& a, valarray<T>& b) noexcept;
}}