Не используйте вектор , на самом деле это не контейнер:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=98
Используйте std :: bitset (для битовых наборов фиксированного размера) и boost :: dynamic_bitset (для изменяемых размеров), где это уместно. Они также не являются контейнерами, но выглядят не так, как должны, поэтому с меньшей вероятностью могут вызвать путаницу.
Ценность компромисса зависит от того, насколько велики массивы в вашей программе. Я думаю, вы правы в том, что издержки доступа к битам обычно незначительны, но если накладные расходы памяти тоже ничтожны, то вам тоже нечего там делать.
Преимущество
битовых наборов состоит в том, что они делают именно то, что говорят на жестяных банках - ни один из них «не объявляет массив символов / целых, но единственными допустимыми значениями являются ноль и ноль». Ваш код будет выглядеть примерно так же, как если бы вы использовали массив.