Посмотрите, как это реализовано. 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>которые заставляют его вести себя по-другому в некоторых случаях.