Schauen Sie sich an, wie es implementiert ist. Die STL baut stark auf Vorlagen auf, und daher enthalten die Header den Code, den sie ausführen.
zum Beispiel betrachten Sie die stdC++ Implementierung here.
auch interessant, obwohl nicht ein STL-konforme Bit-Vektor ist die llvm :: BitVector von here.
das Wesen der llvm::BitVector
ist eine verschachtelte Klasse Überlastung reference
und geeigneten Operator genannt ähnlich die BitVector
verhält sich mit einigen Einschränkungen zu vector
zu machen. Der folgende Code ist eine vereinfachte Schnittstelle, um zu zeigen, wie BitVector eine Klasse mit dem Namen reference
versteckt, damit sich die reale Implementierung fast wie ein reales Bool-Array verhält, ohne dass für jeden Wert 1 Byte verwendet wird.
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;
};
dies hier Code, um die schönen Eigenschaften hat:
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.
Dieser Code tatsächlich einen Fehler hat, versuchen zu laufen:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
wird nicht funktionieren, weil assert((&b[5] - &b[3]) == (5 - 3));
(innerhalb llvm::BitVector
scheitern)
dies ist die sehr einfache llvm-version. std::vector<bool>
hat auch funktionierende Iteratoren. so funktioniert der Anruf for(auto i = b.begin(), e = b.end(); i != e; ++i)
. und auch std::vector<bool>::const_iterator
.
Allerdings gibt es immer noch Einschränkungen in std::vector<bool>
, die es in einige Fällen anders verhalten.
@ Chris und 98 C++. – Rapptz
@Rapptz und C++ 03! – Casey
Es war ein Konstruktionsfehler in C++ 98, jetzt für die Kompatibilität beibehalten. – Oktalist