std::vector<bool> - не совсем std::vectorНа первый взгляд
std::vector<bool> — обычный вектор, только из булевых значений. Но это особенный шаблон. Вместо хранения bool как полноценного байта, он упаковывает их в биты. Экономит память? Да. Но есть нюансы.Пример:
std::vector<bool> flags = {true, false, true};
auto x = flags[0]; // Не bool, а прокси-объект!
bool y = flags[0]; // OK — копия значения
bool& z = flags[0]; // Ошибка компиляции
flags[0] возвращает proxy-объект, а не bool&, потому что нельзя вернуть ссылку на бит. Из-за этого:* Нельзя взять адрес элемента
* Нельзя использовать
std::vector<bool> с API, ожидающим bool* или bool&* Некоторые шаблоны не работают (особенно в generic-коде)
Хочешь экономии — будь готов к сюрпризам. Хочешь предсказуемости — используй
std::deque<bool> или std::vector<char>.⚠️ Кстати,
std::vector<bool> — единственная специализация STL-контейнера в стандартной библиотеке.➡️ @cpp_geek