2011-12-19 1 views
0

私はvector<bool>を実装しています。私は符号なしのintを保存し、ビット単位の演算を使って真と偽のベクトルを持つ。私の問題はこれです。私は[]オペレータによって個々のビットにアクセスすることができますが、どのように私は、私は、私はあなたが個々のビットへの参照/ポインタをすべきではないということを聞いたoperator []がunsigned intの個々のビットへの参照を返すようにするには?

Vector<bool> v(5, true); 
v[3] = false; 

どこかを書き込むことができるようビットへの参照を取得します。ビットの値を取得するために動作するコードの概要、:

だから、
... 
unsigned int arr;  // Store bits as unsigned int 
unsigned int size_vec; // The size of "bool vector" 
... 

bool& Vector<bool>::operator[](unsigned int i) { 
if (i>=vec_size || i<0) { 
    throw out_of_range("Vector<bool>::operator[]"); 
} 
int index = 1 << (i-1); 
bool n = false; 
if (index & arr) { 
    n=true; 
} 
return n; 
}; 

は、どのようにあなたはそれが可能な個々のビットを変更すること参照のいくつかの並べ替えを返すことができますか?

+6

天国いいえ、私たちは*他* 'ベクトル'実装する必要はありません - 1は十分以上です! –

+1

不幸なことに、私に任務を与える人は同意しませんでした。 – pigelin

+1

冷蔵庫はまさに今、何百万という疑問が合理的に見えていて、賢明な助言の最初の兆候には、ああ、私は理由ABCのためにXYZを許可されていませんが、私はあなたにこれを伝えていないより楽しいと思った。 –

答えて

6

bool&のように動作し、個々のビットに対応するように、適切な演算子オーバーロードを使用してプロキシオブジェクトを定義する必要があります。これはstd::vector<bool>の機能です。このような

何か:

struct Bit 
{ 
public: 
    typedef unsigned char byte; 

    Bit(byte& _byte, byte _bit) 
    : m_byte(_byte), m_mask(1u << _bit) 
    {} 

    operator bool() const 
    { 
     return m_byte & m_mask; 
    } 

    Bit& operator=(bool x) 
    { 
     m_byte = x ? m_byte | m_mask : m_byte & ~m_mask; 
     return *this; 
    } 

private: 
    byte& m_byte; 
    const byte m_mask; 
}; 

それは本当にあなたの直感を台無しので、一般的に、私はC++で卑劣な暗黙の変換に依存している。このようなことを避けることをお勧めします、そしてそれはautoのようなものとうまく再生されませんC++ 11ではdecltypeです。

+0

ありがとうございます。私は明日それを試してみます、時々私たちはすべて寝る必要があるので) – pigelin

2

個々のビットを参照することはできません。 変数への参照のみがあります。

あなたができることは、boolへの参照を公開し、基本整数への内部参照と必要なビットフィーディングの仕組みを保持するプロキシクラスを作ることです。 [] - オペレータがそのようなプロキシオブジェクトを返すようにします。

4

boolへの参照を返すことでこれを行うことはできません。プロキシオブジェクトを作成して返す代わりに代入演算子にオーバーロードする必要があります。

struct bit_access_proxy { 
    bit_access_proxy(int& carrier, int bit) { ... } 
    operator bool() const { 
     // return the value of the bit 
    } 
    bit_access_proxy& operator=(bool new_bit) { 
     // set the value of the bit 
    } 
}; 

bit_access_proxy Vector<bool>::operator[](int i) { ... } 
+0

次のように入力するとどうなりますか:int i = v [3]; ?これはプロキシでは機能しませんか?演算子bool()とは何ですか? – pigelin

+0

@ user1067171: 'v [3]'は 'bit_access_proxy'を返します。 'int i = ...'は '演算子bool()'を使ってプロキシを 'bool'に変換し、それを' int'に代入します。 –

3

できません。

あなたは、プロキシオブジェクトを返すことをお勧めします。

開始点:

struct bit { 
    bit(Vector<bool>* vec, size_t pos); 
    bit& operator=(const bool& b); 
    operator bool(); 
    Vector<bool>* vec; 
    size_t pos; 
}; 

bit Vector<bool>::operator[](size_t pos) { 
return bit(this, pos); 
}; 
関連する問題