Lihatlah bagaimana ini diterapkan. STL sangat banyak dibangun di atas template dan oleh karena itu header berisi kode yang mereka lakukan.
misalnya lihat implementasi stdc ++ di sini .
juga menarik meskipun bukan vektor bit sesuai stl adalah llvm :: BitVector dari sini .
inti dari llvm::BitVector
ini adalah kelas bersarang yang dipanggil reference
dan operator yang overloading cocok untuk membuat BitVector
perilaku serupa vector
dengan beberapa batasan. Kode di bawah ini adalah antarmuka yang disederhanakan untuk menunjukkan bagaimana BitVector menyembunyikan kelas yang dipanggil reference
untuk membuat implementasi nyata hampir berperilaku seperti array bool nyata tanpa menggunakan 1 byte untuk setiap nilai.
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;
};
kode ini di sini memiliki properti yang bagus:
BitVector b(10, false);
BitVector::reference &x = b[5];
bool y = b[5];
assert(b[5] == false);
assert(b[6] == b[7]);
b[5] = true;
assert(b[5] == true);
Kode ini sebenarnya memiliki kekurangan, coba jalankan:
std::for_each(&b[5], &b[6], some_func);
tidak akan berfungsi karena assert( (&b[5] - &b[3]) == (5 - 3) );
akan gagal (dalam llvm::BitVector
)
ini adalah versi llvm yang sangat sederhana. std::vector<bool>
juga bekerja iterator di dalamnya. dengan demikian panggilan itu for(auto i = b.begin(), e = b.end(); i != e; ++i)
akan berhasil. dan juga std::vector<bool>::const_iterator
.
Namun masih ada batasan std::vector<bool>
yang membuatnya berperilaku berbeda dalam beberapa kasus.