はじめに
C++の新しい規格「C++0x」では、言語とライブラリの両面から便利な機能が追加されます。「TR1」(Technical Report 1)はC++0xのライブラリ部で、標準C++に新たに追加されるライブラリの多くはBoostの中から選ばれたものです。2008年春にリリースが予定されているVisual Studio 2008にも追加パッケージとして供給されるとの情報を得ています。
TR1に収録されたクラス/関数の中からいくつかをピックアップし、その概要と使い方を予習しておきましょう。
前準備 - Boostのインストール
Boostのインストールは開発環境がVisual Studio 2005であれば、いとも簡単です。Boost consulting - Free Downloadsにあるインストーラをダウンロード/実行するだけで、必要なヘッダ、ライブラリおよびドキュメントがインストールされます。
インストールが完了したらVisual Studio 2005のオプションを変更し、Boostのインクルード/ライブラリパスを設定しておきましょう。
std::tr1::array - 固定長配列
まずは簡単なものから。
プログラム中でしょっちゅうお世話になる配列です。いつも使ってる配列int data[5]
のたぐいをクラスとして提供するものです。
#include <iostream> #include <algorithm> #include <iterator> using namespace std; int main() { const size_t N = 5; int arr[N] = {1,2,3,4,5}; // 配列の要素をプリントする copy(arr, arr+N, ostream_iterator<int>(cout," ")); cout << endl; }
配列に対し標準C++の<algorithm>
を適用するとき、適用範囲すなわちイテレータの組として配列の先頭と末尾、この例ではarr
とarr+N
を与えます。標準C++ライブラリのコンテナであれば、
vector<int> ivec; … // 配列の要素をプリントする copy(ivec.begin(), ivec.end(), ostream_iterator<int>(cout," "));
のように、イテレータを返すメンバbegin()
/end()
が使えます。固定長配列array
は標準C++ライブラリのコンテナと同様のメンバを持ちながら、その実体はビルトイン配列という一風変わったクラスです。
#include <iostream> #include <algorithm> #include <iterator> #include <boost/tr1/array.hpp> // std::tr1::array<T,N> using namespace std; int main() { // template引数には要素の型と要素数を指定する tr1::array<int,5> arr = {{1,2,3,4,5}}; // {{ と }} で囲むべし copy(arr.begin(), arr.end(), ostream_iterator<int>(cout," ")); }
std::tr1::array<T,N>
のtemplate引数T,Nにはそれぞれ要素の型と要素数を指定します。各要素の初期化が必要なら要素並びを{{
と}}
で囲ってください。
std::tr1::array<T,N>
の主要な関数群を以下に示します。
- size()
- operator[](n), at(n)
- front(), back()
- begin(), end()
- rbegin(), rend()
- swap(other)
- assign(value)
- ==, !=, <, <=, >, >=
N
を返します。at(n)
は範囲外(n >= N
)のときstd::range_error
例外をthrowします。tr1::array<int,5> arr = {{1,2,3,4,5}}; copy(arr.rbegin(), arr.rend(), ostream_iterator<int>(cout," "));
array<T,N> other
との間で各要素を交換します。tr1::array<int,5> x; tr1::array<int,5> y; x.swap(y);
value
を代入します。
tr1::array<int,5> x;
x.assign(-1);
array<T,N>
を比較します。大小関係は辞書順(lexicographical)に基づきます。