Regardez comment il est mis en œuvre. le TSL s'appuie largement sur des modèles et, par conséquent, les en-têtes contiennent le code qu'ils font.
par exemple, regardez le stdc++ mise en œuvre ici.
aussi intéressant, même s'il n'est pas stl conforme vecteur de bits est la llvm::BitVector à partir d' ici.
l'essence de l' llvm::BitVector
est une classe imbriquée appelés reference
et convenables la surcharge d'opérateur pour faire de l' BitVector
se comporte de façon similaire à l' vector
avec certaines limitations. Le code ci-dessous est une interface simplifiée pour montrer comment BitVector cache une classe appelée reference
pour faire de la mise en œuvre réelle presque se comporter comme un vrai tableau de bool sans l'aide de 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 ici a les plus 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 de le lancer:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
ne fonctionnera pas parce qu' assert( (&b[5] - &b[3]) == (5 - 3) );
va échouer (dans llvm::BitVector
)
c'est très simple llvm version. std::vector<bool>
a aussi le travail des itérateurs en elle.
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 limitations en std::vector<bool>
qui lui permet de se comporter différemment dans certains cas.