Guarda come viene implementato. l'STL si basa ampiamente sui modelli e quindi le intestazioni contengono il codice che contengono.
per esempio guarda qui l' implementazione di stdc ++ .
anche interessante anche se non un vettore di bit conforme a stl è llvm :: BitVector da qui .
l'essenza di llvm::BitVector
è una classe annidata chiamata reference
e un operatore adatto che sovraccarica per rendere i BitVector
comportamenti simili vector
con alcune limitazioni. Il codice seguente è un'interfaccia semplificata per mostrare come BitVector nasconde una classe chiamata reference
per fare in modo che l'implementazione reale si comporti quasi come un vero array di bool senza usare 1 byte per ogni valore.
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;
};
questo codice qui ha le belle proprietà:
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.
Questo codice ha effettivamente un difetto, prova a eseguire:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
non funzionerà perché assert( (&b[5] - &b[3]) == (5 - 3) );
fallirà (entro llvm::BitVector
)
questa è la versione molto semplice di llvm. std::vector<bool>
contiene anche iteratori funzionanti. quindi la chiamata for(auto i = b.begin(), e = b.end(); i != e; ++i)
funzionerà. e anche std::vector<bool>::const_iterator
.
Tuttavia ci sono ancora delle limitazioni std::vector<bool>
che lo fanno comportare in modo diverso in alcuni casi.