バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWBitVec

形式

#include <rw/bitvec.h>
RWBitVec v;

説明

クラス RWBitVec は、実行時に長さを変えられるビットベクトルです。長さを変えるには 多段階の間接参照が必要なので、コンパイル時に長さが決まるクラス RWGBitVec(size)RWTBitVec<size> より多少効率が悪くなります。

持続性

単純

#include <rw/bitvec.h>
#include <rw/rstream.h>
main() {
    // 20 ビットのベクトルを割り当て、TRUE に設定する
    RWBitVec av(20, TRUE);

    av(2) = FALSE;  // ビット 2 をオフにする
    av.clearBit(7); // ビット 7 をオフにする
    av.setBit(2);   // ビット 2 をオンに戻す

    for(int i=11; i<=14; i++) av(i) = FALSE;

    cout << av << endl; // ベクトルを出力する
}

プログラム出力:

   [
   1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1
   ]

公開コンストラクタ

RWBitVec();

長さがゼロのベクトル (空ベクトル) を作成します。

RWBitVec(size_t N);

N ビットのベクトルを作成します。各ビットの初期値は未定義です。

RWBitVec(size_t N, RWBoolean initVal);

N ビットのベクトルを作成し、各ビットをブール (論理) 値 initVal に設定します。

RWBitVec(const RWByte* bp, size_t N);

N ビットのベクトルを作成し、バイト配列 bp 内のデータで初期化します。この配列は、最低 N ビットの長さを持たなければなりません。識別子 RWByte は、unsigned chartypedef です。

RWBitVec(const RWBitVec& v);

コピーコンストラクタ。値の意味を使用して、作成したベクトルが v のコピーになるようにします。

~RWBitVec();

デストラクタ。割り当てられているメモリーをすべて解放します。

代入演算子

RWBitVec&
operator=(const RWBitVec& v);

代入演算子。値の意味を使用して、自分自身が v のコピーになるようにします。

RWBitVec&
operator=(RWBoolean b);

代入演算子。自分自身内の各ビットをブール値 b に設定します。

RWBitVec&
operator&=(const RWBitVec& v);
RWBitVec&
operator^=(const RWBitVec& v);
RWBitVec&
operator|=(const RWBitVec& v);

論理代入演算子。自分自身内の各要素に、自身と v の対応ビットの論理積、排他的論理和、論理和をそれぞれ設定します。自身と v の要素の数は同じでなければなりません。同じでないと、RWInternalErr 型の例外が発生します。

インデックス付け演算子

RWBitRef
operator[](size_t i);

自分自身のビット i に対する参照を返します。ヘルパクラス RWBitRef を使用します。結果は左辺値として使用できます。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。境界検査を行い、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

RWBitRef
operator()(size_t i);

自分自身のビット i への参照を返します。ヘルパクラス RWBitRef を使用します。結果は左辺値として使用できます。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。ヘッダファイル <rw/bitvec.h>を取り込む前に前処理マクロ RWBOUNDS_CHECK が定義されている場合だけ境界検査を行います。境界検査の結果、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

RWBoolean
operator[](size_t i) const;

ビット i のブール値を返します。結果は左辺値として使用できません。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。境界検査を行い、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

RWBoolean
operator()(size_t i) const;

ビット i のブール値を返します。結果は左辺値として使用できません。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。ヘッダファイル <rw/bitvec.h> を取り込む前にプリプロセッサマクロ RWBOUNDS_CHECK が定義されている場合だけ、境界検査を行います。境界検査の結果、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

論理演算子

RWBoolean
operator==(const RWBitVec& u) const;

自分自身と v が同じ長さで自身の各ビットが v の対応ビットと同じ値の場合に TRUE を、それ以外の場合は FALSE を返します。

RWBoolean
operator!=(const RWBitVec& u) const;

自分自身と v が同じ長さで自身の各ビットが v の対応ビットと同じ値の場合に FALSE を、それ以外の場合は TRUE を返します。

RWBoolean
operator==(RWBoolean b) const;

自分自身の各ビットがブール値 b に設定されている場合に TRUE を、それ以外の場合は FALSE を返します。

RWBoolean
operator!=(RWBoolean b) const;

自分自身の各ビットがブール値 b に設定されている場合に FALSE を、それ以外の場合は TRUE を返します。

公開メンバー関数

void
clearBit(size_t i);

インデックス i を持つビットをクリアします (FALSE に設定する)。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。境界検査は行いません。次の 2 つのコードは同等です。clearBit(size_t) の方が、operator()(size_t) を使用するよりも、コードが多少小さくなり、実行が速くなります。

   a(i) = FALSE;
   a.clearBit(i);
const RWByte*
data() const;

自分自身の生データへの const ポインタを返します。使用には注意が必要です。

size_t
firstFalse() const;

自分自身内の最初の FALSE ビットのインデックスを返します。FALSE ビットが見つからない場合は RW_NPOS を返します。

size_t
firstTrue() const;

自分自身内の最初の TRUE ビットのインデックスを返します。TRUE ビットが見つからない場合は RW_NPOS を返します。

unsigned
hash() const;

ハッシュするのに適切な値を返します。

RWBoolean
isEqual(const RWBitVec& v) const;

自分自身と v とが同じ長さで、自身の各ビットが v の対応するビットと同じ値であれば、TRUE を、それ以外の場合は FALSE を返します。

size_t
length() const;

ベクトルのビット数を返します。

ostream&
printOn(ostream& s) const;

出力ストリーム s にベクトル v を出力します。出力書式の例は、前記の例を参照してください。

void
resize(size_t N);

ベクトルのサイズを N に変更します。ベクトルが長くなる場合、追加されたビットは FALSE に設定されます。

istream&
scanFrom(istream&);

入力ストリーム s からビットベクトルを読み取ります。このとき、ベクトルは必要に応じて動的にサイズが変わります。ベクトルの書式は、メンバー関数 printOn(ostream&) と同じでなければなりません。

void
setBit(size_t i);

インデックス i を持つビットを TRUE に設定します。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。境界検査は行いません。次の 2 つのコードは同等です。setBit(size_t) の方が、operator()(size_t) を使用するよりもコードが多少小さくなり、実行が速くなります。

   a(i) = TRUE;
   a.setBit(i);
RWBoolean
testBit(size_t i) const;

インデックス i を持つビットをテストします。インデックス i は、0 〜 (ベクトル長 -1) の範囲になければなりません。境界検査は行いません。次の 2 つのコードは同等です。testBit(size_t) の方が、operator()(size_t) を使用するよりも、コードが多少小さくなり、実行が速くなります。

   if( a(i) )              doSomething();
   if( a.testBit(i) )      doSomething();

関連の大域関数

RWBitVec
operator!(const RWBitVec& v);

ベクトル v の論理否定を返す単項演算子。

RWBitVec
operator&(const RWBitVec&,const RWBitVec&);
RWBitVec
operator^(const RWBitVec&,const RWBitVec&);
RWBitVec
operator|(const RWBitVec&,const RWBitVec&);

ベクトル v1v2 との論理積、排他的論理和、論理和を返します。v1v2 は、同じ長さでなければなりません。同じでないと、RWInternalErr 型の例外が発生します。

ostream&
operator<<(ostream& s, const RWBitVec& v);

v.printOn(s) を呼び出します。

istream&
operator>>(istream& s, RWBitVec& v);

v.scanFrom(s) を呼び出します。

RWvistream&
operator<<(RWvistream&, RWBitVec& vec);
RWFile&
operator<<(RWFile&,     RWBitVec& vec);

RWBitVec vec を、仮想ストリームまたは RWFile に保存します。

RWvistream&
operator>>(RWvistream&, RWBitVec& vec);
RWFile&
operator>>(RWFile&,     RWBitVec& vec);

仮想ストリームまたは RWFile から RWBitVecvec に復元し、vec の前の内容を書き換えます。

size_t
sum(const RWBitVec& v);

ベクトル v 内の TRUE ビットの総数を返します。