Regardez comment il est mis en œuvre. la STL s'appuie largement sur des modèles et, par conséquent, les en-têtes contiennent le code qu'ils contiennent.
par exemple regarder à l' stdc ++ mise en œuvre ici .
également intéressant, même si ce n'est pas un vecteur de bits conforme stl, est le llvm :: BitVector d' ici .
L'essence de la llvm::BitVector
est une classe imbriquée appelée reference
et une surcharge d'opérateur appropriée pour rendre le BitVector
comportement similaire à vector
avec certaines limitations. Le code ci-dessous est une interface simplifiée pour montrer comment BitVector cache une classe appelée reference
pour que l'implémentation réelle se comporte presque comme un vrai tableau de booléens sans utiliser 1 octet pour chaque valeur.
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;
};
ce code a ici les belles propriétés:
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.
Ce code a en fait un défaut, essayez d'exécuter:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
ne fonctionnera pas car assert( (&b[5] - &b[3]) == (5 - 3) );
échouera (à l'intérieur llvm::BitVector
)
c'est la version llvm très simple. std::vector<bool>
contient également des itérateurs fonctionnels. ainsi l'appel for(auto i = b.begin(), e = b.end(); i != e; ++i)
fonctionnera. et aussi std::vector<bool>::const_iterator
.
Cependant, il y a encore des limites std::vector<bool>
qui font qu'il se comporte différemment dans certains cas.