Ответ 1
Почему у std::vector нет .data()?
Поскольку std::vector<bool>
хранит несколько значений в 1 байт.
Подумайте об этом как о сжатой системе хранения, где каждое логическое значение требует 1 бит. Таким образом, вместо того, чтобы иметь один элемент на блок памяти (один элемент на ячейку массива), макет памяти может выглядеть следующим образом:
Предполагая, что вы хотите индексировать блок для получения значения, как бы вы использовали оператор []
? Он не может вернуть bool&
(поскольку он возвращает один байт, в котором хранится более одного bools
), поэтому вы не можете назначить ему bool*
. Другими словами, bool *bool_ptr =&v[0];
является недопустимым кодом и приведет к ошибке компиляции.
Более того, правильная реализация может не иметь такой специализации и не выполнять оптимизацию памяти (сжатие). Таким образом, data()
придется копировать в ожидаемый тип возвращаемого значения в зависимости от реализации (или стандарт должен принудительно оптимизировать, а не просто разрешать его).
Почему указатель на массив bools не возвращается?
Потому что std::vector<bool>
не сохраняется как массив bools, поэтому никакой указатель не может быть возвращен простым способом. Он мог бы сделать это, скопировав данные в массив и вернув этот массив, но это выбор дизайна не для этого (если бы они это сделали, я бы подумал, что это работает как data()
для всех контейнеров, что вводит в заблуждение).
Каковы преимущества в том, чтобы не делать этого?
Оптимизация памяти.
Обычно в 8 раз меньше использования памяти, поскольку он хранит несколько бит в одном байте. Точнее, CHAR_BIT
раз меньше.