看一下它是如何实现的。STL很大程度上建立在模板上,因此标头确实包含其执行的代码。
例如,在这里查看stdc ++实现。
即使不是符合stl的位向量,也很有趣,它是llvm :: BitVector from here。
的本质llvm::BitVector
是称为的嵌套类,reference
并进行了适当的运算符重载,以使BitVector
行为类似,但vector
有一些限制。下面的代码是一个简化的接口,用于显示BitVector如何隐藏一个名为的类,reference
以使真实实现几乎像布尔的真实数组一样工作,而每个值不使用1个字节。
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;
};
此代码具有不错的属性:
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.
这段代码实际上有一个缺陷,请尝试运行:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
将不起作用,因为assert( (&b[5] - &b[3]) == (5 - 3) );
将失败(在内llvm::BitVector
)
这是非常简单的llvm版本。std::vector<bool>
也有有效的迭代器。因此该呼叫for(auto i = b.begin(), e = b.end(); i != e; ++i)
将起作用。还有std::vector<bool>::const_iterator
。
但是,仍然存在一些限制std::vector<bool>
,使其在某些情况下的行为有所不同。