CodeZine(コードジン)

特集ページ一覧

BoostでC++0xのライブラリ「TR1」を先取りしよう (1)

arrayとshared_ptr/weak_ptr

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/12/11 14:00

C++の新しい規格「C++0x」に追加予定のライブラリ群「TR1」の概要を、Boost版を使って解説します(Visual Studio 2008にも追加パッケージとして供給される予定)。第1回は、arrayとshared_ptr/weak_ptrについて。

目次

はじめに

 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>を適用するとき、適用範囲すなわちイテレータの組として配列の先頭と末尾、この例ではarrarr+Nを与えます。標準C++ライブラリのコンテナであれば、

std::vectorだと…
vector<int> ivec;
…
// 配列の要素をプリントする
copy(ivec.begin(), ivec.end(), ostream_iterator<int>(cout," "));

 のように、イテレータを返すメンバbegin()/end()が使えます。固定長配列arrayは標準C++ライブラリのコンテナと同様のメンバを持ちながら、その実体はビルトイン配列という一風変わったクラスです。

boost::arrayだと...
#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()
  • 要素数Nを返します。
  • operator[](n), at(n)
  • n番目の要素。at(n)は範囲外(n >= N)のときstd::range_error例外をthrowします。
  • front(), back()
  • それぞれ先頭要素/末尾要素を返します。
  • begin(), end()
  • それぞれ先頭/末尾のイテレータを返します。
  • rbegin(), rend()
  • それぞれ先頭/末尾の逆順イテレータを返します。
    逆順にプリント
    tr1::array<int,5> arr = {{1,2,3,4,5}};
    copy(arr.rbegin(), arr.rend(), ostream_iterator<int>(cout," "));
    
  • swap(other)
  • array<T,N> otherとの間で各要素を交換します。
    xとyを丸ごと交換
    tr1::array<int,5> x;
    tr1::array<int,5> y;
    x.swap(y);
    
  • assign(value)
  • 全要素にvalueを代入します。
    全要素を-1に初期化
    tr1::array<int,5> x;
    x.assign(-1);
    
  • ==, !=, <, <=, >, >=
  • ふたつのarray<T,N>を比較します。大小関係は辞書順(lexicographical)に基づきます。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • επιστημη(エピステーメー)

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"り わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準...

バックナンバー

連載:BoostでC++0xのライブラリ「TR1」を先取りしよう
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5