Mira cómo se implementa. el STL se basa en gran medida en plantillas y, por lo tanto, los encabezados contienen el código que contienen.
por ejemplo, mire la implementación de stdc ++ aquí .
También es interesante, aunque no es un vector de bits conforme a stl, el llvm :: BitVector de aquí .
la esencia de llvm::BitVector
es una clase anidada llamada reference
y una sobrecarga de operador adecuada para hacer que el BitVector
comportamiento sea similar vector
con algunas limitaciones. El siguiente código es una interfaz simplificada para mostrar cómo BitVector oculta una clase llamada reference
para hacer que la implementación real se comporte casi como una matriz real de bool sin usar 1 byte para cada valor.
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;
};
este código aquí tiene las buenas propiedades:
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.
Este código en realidad tiene una falla, intente ejecutar:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
no funcionará porque assert( (&b[5] - &b[3]) == (5 - 3) );
fallará (dentro llvm::BitVector
)
esta es la versión llvm muy simple. std::vector<bool>
también tiene iteradores de trabajo. así la llamada for(auto i = b.begin(), e = b.end(); i != e; ++i)
funcionará. y también std::vector<bool>::const_iterator
.
Sin embargo, todavía existen limitaciones std::vector<bool>
que hacen que se comporte de manera diferente en algunos casos.