Тема: Почему std::vector<bool> - не совсем std::vector
Тема: Почему 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-контейнера в стандартной библиотеке.