Nhìn vào cách nó được thực hiện. STL xây dựng rất nhiều trên các mẫu và do đó các tiêu đề có chứa mã mà chúng thực hiện.
ví dụ: hãy xem việc triển khai stdc ++ ở đây .
cũng thú vị mặc dù không phải là một vectơ bit phù hợp với stl là llvm :: BitVector từ đây .
bản chất của llvm::BitVector
là một lớp lồng nhau được gọi reference
và nạp chồng toán tử phù hợp để làm cho các BitVector
hành vi tương tự vector
với một số hạn chế. Đoạn mã dưới đây là một giao diện được đơn giản hóa để cho thấy cách BitVector ẩn một lớp được gọi reference
để làm cho việc triển khai thực gần như hoạt động giống như một mảng bool thực mà không sử dụng 1 byte cho mỗi giá trị.
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;
};
mã này ở đây có các thuộc tính tốt:
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.
Mã này thực sự có một lỗ hổng, hãy thử chạy:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
sẽ không hoạt động vì assert( (&b[5] - &b[3]) == (5 - 3) );
sẽ thất bại (trong llvm::BitVector
)
đây là phiên bản llvm rất đơn giản. std::vector<bool>
cũng có các trình vòng lặp hoạt động trong đó. như vậy cuộc gọi for(auto i = b.begin(), e = b.end(); i != e; ++i)
sẽ hoạt động. và cả std::vector<bool>::const_iterator
.
Tuy nhiên, vẫn có những hạn chế trong std::vector<bool>
đó làm cho nó hoạt động khác nhau trong một số trường hợp.