実装方法を見てください。STLはテンプレートに大きく基づいて構築されているため、ヘッダーにはテンプレートが実行するコードが含まれています。
たとえば、こちらのstdc ++実装を見てください。
stl準拠のビットベクトルではありませんが、ここからのllvm :: BitVectorも興味深いです。
の本質llvm::BitVector
は、ネストされたクラスと呼ばれ、いくつかの制限付きで動作を同様にreference
するための適切な演算子のオーバーロードです。以下のコードは、BitVectorが呼び出されたクラスをどのように隠して実際の実装をブール値の実際の配列のように動作させ、各値に1バイトを使用しないかを示す簡略化されたインターフェイスです。BitVector
vector
reference
class BitVector {
public:
class reference {
reference &operator=(reference t);
reference& operator=(bool t);
operator bool() const;
};
reference operator[](unsigned Idx);
bool operator[](unsigned Idx) const;
};
ここのこのコードには素晴らしいプロパティがあります:
BitVector b(10, false); // size 10, default false
BitVector::reference &x = b[5]; // that's what really happens
bool y = b[5]; // implicitly converted to bool
assert(b[5] == false); // converted to bool
assert(b[6] == b[7]); // bool operator==(const reference &, const reference &);
b[5] = true; // assignment on reference
assert(b[5] == true); // and actually it does work.
このコードには実際に欠陥があります。実行してみてください:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
assert( (&b[5] - &b[3]) == (5 - 3) );
失敗するため(内でllvm::BitVector
)、機能しません
これは非常にシンプルなllvmバージョンです。std::vector<bool>
その中にも動作するイテレータがあります。したがって、呼び出しfor(auto i = b.begin(), e = b.end(); i != e; ++i)
は機能します。そしてまたstd::vector<bool>::const_iterator
。
ただし、場合によってはstd::vector<bool>
動作が異なるという制限があります。