看看它是如何实现的。STL 大量构建在模板上,因此标题确实包含它们所做的代码。
例如看这里的stdc++实现。
即使不是符合 stl 的位向量也是来自这里的llvm::BitVector也很有趣。
的本质llvm::BitVector
是一个嵌套类,称为reference
和适当的运算符重载,以使BitVector
行为类似于vector
但有一些限制。下面的代码是一个简化的界面,展示了 BitVector 如何隐藏一个调用的类reference
,以使实际实现几乎表现得像一个真正的 bool 数组,而不为每个值使用 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>
这使得它在某些情况下表现不同。