Посмотрите, как это реализовано. 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>
все еще есть ограничения, из-за которых в некоторых случаях он ведет себя иначе.
person
Alexander Oh
schedule
22.07.2013
std::vector<bool>
не должен компилироваться. Еще помню, что это специализация. - person πάντα ῥεῖ   schedule 22.07.2013bool
, так как у элемента нет своего адреса. - person chris   schedule 22.07.2013std::vector<bool> v;
скомпилирует.&v[0]
не будет (взяв адрес временный). - person Oktalist   schedule 22.07.2013bool
и поэтому ведет себя разумно. - person Bartek Banachewicz   schedule 22.07.2013vector<bool>
плохая репутация, но не совсем оправданно: isocpp.org/blog/2012/11 / on-vectorbool - person TemplateRex   schedule 23.07.2013bool[]
не упаковываются с 1 битом на логическое значение, какvector<bool>
. - person jrh   schedule 04.11.2018bool
не имеет стандартизированной реализации, вы не можете полагаться на какую-либо конкретную его функцию (в стандартном переносимом исходном коде C ++), за исключением использования его какbool
, который должен работать, и который также хорошо работает сvector<bool>
. Его размер не определен, иvector<bool>
просто переводит его на другой уровень (без адреса), чтобы получить особую выгоду от оптимизации размера. Рекомендовать вообще избегать - это как: раздувать ПО. - person Ped7g   schedule 09.09.2019