Spec-Zone.ru › C++

std::vector<bool>

Определено в заголовочном файле <vector>
template<
    class Allocator
> class vector<bool, Allocator>;

std::vector<bool> — это, возможно, более эффективный по использованию памяти специализированный вариант std::vector для типа bool.

Способ, которым std::vector<bool> оптимизируется по памяти (а также оптимизируется ли он вообще), зависит от реализации. Одна из потенциальных оптимизаций заключается в объединении элементов вектора таким образом, чтобы каждый элемент занимал один бит вместо sizeof(bool) байтов.

std::vector<bool> ведет себя аналогично std::vector, но для повышения эффективности использования памяти:

  • Не обязательно хранит свои элементы в виде непрерывного массива.
  • Представляет класс std::vector<bool>::reference как способ доступа к отдельным битам. В частности, объекты этого класса возвращаются методом operator[] по значению.
  • Не использует std::allocator_traits::construct для построения значений битов.
  • Не гарантирует, что разные элементы в одном контейнере могут быть изменены одновременно разными потоками.

Типы членов

Тип члена Определение
value_type bool
allocator_type Allocator
size_type Зависит от реализации
difference_type Зависит от реализации
reference
Класс-прокси, представляющий ссылку на один bool
(класс)
const_reference bool
pointer Зависит от реализации
const_pointer Зависит от реализации
iterator

Зависит от реализации

(до C++20)

Зависит от реализации ConstexprIterator

(с C++20)
const_iterator

Зависит от реализации

(до C++20)

Зависит от реализации ConstexprIterator

(с C++20)
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

Члены-функции

(конструктор)
создаёт vector
(публичный метод класса std::vector<T,Allocator>)
(деструктор)
уничтожает vector
(публичный метод класса std::vector<T,Allocator>)
operator=
присваивает значения контейнеру
(публичный метод класса std::vector<T,Allocator>)
assign
присваивает значения контейнеру
(публичный метод класса std::vector<T,Allocator>)
get_allocator
возвращает связанный аллокатор
(публичный метод класса std::vector<T,Allocator>)
Доступ к элементам
at
доступ к элементу с проверкой границ
(публичный метод класса std::vector<T,Allocator>)
operator[]
доступ к элементу
(публичный метод класса std::vector<T,Allocator>)
front
доступ к первому элементу
(публичный метод класса std::vector<T,Allocator>)
back
доступ к последнему элементу
(публичный метод класса std::vector<T,Allocator>)
Итераторы
begincbegin
(C++11)
возвращает итератор к началу
(публичный метод класса std::vector<T,Allocator>)
endcend
(C++11)
возвращает итератор к концу
(публичный метод класса std::vector<T,Allocator>)
rbegincrbegin
(C++11)
возвращает обратный итератор к началу
(публичный метод класса std::vector<T,Allocator>)
rendcrend
(C++11)
возвращает обратный итератор к концу
(публичный метод класса std::vector<T,Allocator>)
Ёмкость
empty
проверяет, пуст ли контейнер
(публичный метод класса std::vector<T,Allocator>)
size
возвращает количество элементов
(публичный метод класса std::vector<T,Allocator>)
max_size
возвращает максимальное возможное количество элементов
(публичный метод класса std::vector<T,Allocator>)
reserve
резервирует память
(публичный метод класса std::vector<T,Allocator>)
capacity
возвращает количество элементов, которое может быть размещено в текущем выделенном пространстве
(публичный метод класса std::vector<T,Allocator>)
Модификаторы
clear
очищает содержимое
(публичный метод класса std::vector<T,Allocator>)
insert
вставляет элементы
(публичный метод класса std::vector<T,Allocator>)
emplace
(C++11)
создаёт элемент на месте
(публичный метод класса std::vector<T,Allocator>)
erase
удаляет элементы
(публичный метод класса std::vector<T,Allocator>)
push_back
добавляет элемент в конец
(публичный метод класса std::vector<T,Allocator>)
emplace_back
(C++11)
создаёт элемент на месте в конце
(публичный метод класса std::vector<T,Allocator>)
pop_back
удаляет последний элемент
(публичный метод класса std::vector<T,Allocator>)
resize
изменяет количество хранимых элементов
(публичный метод класса std::vector<T,Allocator>)
swap
меняет местами содержимое
(публичный метод класса std::vector<T,Allocator>)
Модификаторы, специфичные для vector<bool>
flip
инвертирует все биты
(публичный метод)
swap
[static]
меняет местами два std::vector<bool>::reference
(публичный статический метод)

Внешние функции

operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20)
лексикографически сравнивает значения двух vectors
(шаблон функции)
std::swap(std::vector)
специализация алгоритма std::swap
(шаблон функции)
erase(std::vector)erase_if(std::vector)
(C++20)
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции)

Вспомогательные классы

std::hash<std::vector<bool>>
(C++11)
Поддержка хеширования для std::vector<bool>
(специализация шаблона класса)

Руководства по выводу типов (C++17)

Примечания

Если размер набора битов известен на этапе компиляции, можно использовать std::bitset, что предоставляет более богатый набор функций-членов. Кроме того, boost::dynamic_bitset существует как альтернатива std::vector<bool>.

Поскольку его представление может быть оптимизировано, std::vector<bool> необязательно удовлетворяет всем требованиям контейнера или последовательного контейнера. Например, так как std::vector<bool>::iterator определяется реализацией, он может не удовлетворять требованию итератора вперед. Использование алгоритмов, таких как std::search, которые требуют итераторов вперед, может привести к ошибкам на этапе компиляции или выполнения.

Версия vector из Boost.Container не специализируется для bool.

Примечания

Макрос проверки наличия функции Значение Std Функция
__cpp_lib_containers_ranges 202202L (C++23) Конструирование и вставка для контейнеров с использованием диапазонов

Отчеты об ошибках

Следующие отчеты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применимо к Поведение, как опубликовано Правильное поведение
LWG 2187 C++11 специализации для bool не имели функций-членов emplace и emplace_back добавлены

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/vector_bool

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API