Посмотрите, как это реализовано. STL в значительной степени строится на шаблонах, и поэтому заголовки содержат код, который они содержат.
например, посмотрите здесь реализацию stdc ++ .
Также интересно , даже если не СТЛ соответствующий битовый вектор является 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);
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);
В этом коде действительно есть недостаток, попробуйте запустить:
std::for_each(&b[5], &b[6], some_func);
не будет работать, потому что 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>
которые заставляют его вести себя по-другому в некоторых случаях.