std::vector< bool >
упаковывает его содержимое, поэтому каждое булево значение хранится в одном бите, восемь бит - в байт. Это эффективно с точки зрения памяти, но вычислительно интенсивно, так как процессор должен выполнить арифметику для доступа к запрошенному биту. И это не работает с bool
ссылкой или семантикой указателя, поскольку биты внутри байта не имеют адресов в объектной модели C ++.
Вы все же можете объявить переменную типа std::vector<bool>::reference
и использовать как будто это было bool&
. Это позволяет универсальным алгоритмам быть совместимыми.
std::vector< bool > bitvec( 22 );
std::vector< bool >::reference third = bitvec[ 2 ];
third = true; // assign value to referenced bit
В C ++ 11 вы можете обойти это с помощью auto
и спецификатора &&
, который автоматически выбирает ссылку на lvalue, привязанную к векторному элементу или ссылку rvalue, привязанную к временному.
std::vector< bool > bitvec( 22 );
auto &&third = bitvec[ 2 ]; // obtain a std::vector< bool >::reference
third = true; // assign value to referenced bit