C/C++ Ready | Программирование
Фотография
нажмите — покажем
нажмите — покажем
Почему std::vector<bool> может вести себя странно?
На первый взгляд vector<bool> выглядит как обычный vector, только для логических значений. Кажется, что каждый элемент там настоящий bool.
Но у этого контейнера есть специальная оптимизация. Он может хранить значения битами, поэтому обращение к элементу возвращает не bool&, а proxy-объект.
Обычный код выглядит нормально:
std::vector<bool> flags = {true, false};
flags[1] = true;
Проблемы начинаются, когда хочется взять ссылку на элемент:
auto& item = flags[0];
Такой код может не сработать так, как ожидается, потому что flags[0] не является настоящей ссылкой на bool.
Даже auto может скрыть нюанс:
auto item = flags[0];
item = false;
Здесь item часто остаётся proxy-объектом, который связан с контейнером. Код читается как работа с копией, но на деле может менять исходный vector.
Если нужен обычный массив флагов без таких сюрпризов, часто проще взять другой тип:
std::vector<char> flags;
std::vector<uint8_t> mask;
А если важна компактная битовая упаковка, лучше явно показать намерение:
std::bitset<64> flags;
vector<bool> не запрещён, но его лучше не воспринимать как обычный vector<T>. Особенно в шаблонном коде, где ожидаются настоящие ссылки на элементы.
📣 C++ Ready | #совет
14 · 3.2K ·