tgoop.com/cpp_geek/330
Create:
Last Update:
Last Update:
Тема: Почему 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
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/330