std::vector<bool>Кажется, что
std::vector<bool> — обычный вектор из bool. Но на самом деле это не так.Под капотом
vector<bool> хранит биты плотно упакованными (1 бит на элемент), а не как bool (обычно 1 байт). Из-за этого:- Элемент — это не
bool&, а прокси-объект (std::vector<bool>::reference).- Нельзя получить настоящий указатель на элемент:
&v[0] не даст bool*.- Код работает медленнее из-за лишней возни с битовыми масками.
Пример неожиданности:
std::vector<bool> v{true, false};
auto p = &v[0]; // ❌ Ошибка! Нет bool*
Хотите реально быстрый и предсказуемый контейнер?
- Используйте
std::vector<char> или std::vector<uint8_t> для хранения флагов.- Или подключите
boost::dynamic_bitset, если нужна именно битовая упаковка.Итог:
vector<bool> — это костыль ради экономии памяти. Если важны скорость и нормальная семантика — обходите стороной.➡️ @cpp_geek