std:: vector<bool>
|
Определено в заголовке
<vector>
|
||
|
template
<
class
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
|
определяется реализацией | ||||
|
прокси-класс, представляющий ссылку на отдельное значение
bool
(класс) |
|||||
const_reference
|
bool | ||||
pointer
|
определяется реализацией | ||||
const_pointer
|
определяется реализацией | ||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Функции-члены
создаёт
vector
(публичная функция-член
std::vector<T,Allocator>
)
|
|
уничтожает
vector
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
присваивает значения контейнеру
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
присваивает значения контейнеру
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
(C++23)
|
присваивает диапазон значений контейнеру
(публичная функция-член
std::vector<T,Allocator>
)
|
|
возвращает связанный аллокатор
(публичная функция-член
std::vector<T,Allocator>
)
|
|
Доступ к элементам |
|
|
доступ к указанному элементу с проверкой границ
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
доступ к указанному элементу
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
доступ к первому элементу
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
доступ к последнему элементу
(публичная функция-член
std::vector<T,Allocator>
)
|
|
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(публичная функция-член
std::vector<T,Allocator>
)
|
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член
std::vector<T,Allocator>
)
|
|
(C++11)
|
возвращает обратный итератор на начало
(публичная функция-член
std::vector<T,Allocator>
)
|
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член
std::vector<T,Allocator>
)
|
Емкость |
|
|
проверяет, является ли контейнер пустым
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
возвращает количество элементов
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
возвращает максимально возможное количество элементов
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
резервирует память
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
возвращает количество элементов, которое может содержаться в выделенной в данный момент памяти
(публичная функция-член
std::vector<T,Allocator>
)
|
|
Модификаторы |
|
|
очищает содержимое
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
вставляет элементы
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член
std::vector<T,Allocator>
)
|
|
(C++23)
|
добавляет диапазон элементов в конец
(публичная функция-член
std::vector<T,Allocator>
)
|
|
(C++11)
|
создаёт элемент на месте
(публичная функция-член
std::vector<T,Allocator>
)
|
|
удаляет элементы
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
добавляет элемент в конец
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
(C++11)
|
создаёт элемент на месте в конце контейнера
(публичная функция-член
std::vector<T,Allocator>
)
|
|
удаляет последний элемент
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
изменяет количество хранимых элементов
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
обменивает содержимое
(публичная функция-член
std::vector<T,Allocator>
)
|
|
|
|
|
инвертирует все биты
(публичная функция-член) |
|
|
[static]
|
обменивает два
std::vector<bool>::
reference
s
(публичная статическая функция-член) |
Функции, не являющиеся членами класса
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
vector
ов
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
Вспомогательные классы
|
(C++11)
|
поддержка хеширования для
std
::
vector
<
bool
>
(специализация шаблона класса) |
Руководства по выводу (C++17)
Примечания
Если размер bitset известен на этапе компиляции,
std::bitset
может быть использован, который предлагает более богатый набор методов. Кроме того,
boost::dynamic_bitset
существует в качестве альтернативы
std
::
vector
<
bool
>
.
Поскольку его представление может быть оптимизировано,
std
::
vector
<
bool
>
не обязательно удовлетворяет всем требованиям
Container
или
SequenceContainer
. Например, поскольку
std
::
vector
<
bool
>
::
iterator
определяется реализацией, он может не удовлетворять требованию
LegacyForwardIterator
. Использование алгоритмов, таких как
std::search
, которые требуют
LegacyForwardIterator
s
, может привести к
ошибкам времени компиляции или времени выполнения
.
Boost.Container версия
vector
не специализируется для
bool
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Конструирование и вставка диапазонов для контейнеров |
Пример
#include <cassert> #include <initializer_list> #include <iostream> #include <vector> void println(auto rem, const std::vector<bool>& vb) { std::cout << rem << " = ["; for (std::size_t t{}; t != vb.size(); ++t) std::cout << (t ? ", " : "") << vb[t]; std::cout << "]\n"; } int main() { std::vector<bool> v1; // создает пустой вектор булевых значений println("1) v1", v1); std::vector<bool> v2{0, 1, 1, 0, 1}; // создает заполненный вектор println("2) v2", v2); v1 = v2; // копирует v2 в v1 println("3) v1", v1); assert(v1.size() == v2.size()); // проверяет, что размеры v1 и v2 равны assert(v1.front() == false); // обращается к первому элементу, эквивалентно: assert(v1[0] == false); assert(v1.back() == true); // обращается к последнему элементу, эквивалентно: assert(v1[v1.size() - 1] == true); v1 = {true, true, false, false}; // присваивает список инициализации println("4) v1", v1); v1.push_back(true); // добавляет один элемент в конец println("5) v1", v1); v1.pop_back(); // удаляет один элемент с конца println("6) v1", v1); v1.flip(); // инвертирует все элементы println("7) v1", v1); v1.resize(8, true); // изменяет размер v1; новые элементы устанавливаются в «true» println("8) v1", v1); v1.clear(); // очищает v1 assert(v1.empty()); // проверяет, что v1 пуст }
Вывод:
1) v1 = [] 2) v2 = [0, 1, 1, 0, 1] 3) v1 = [0, 1, 1, 0, 1] 4) v1 = [1, 1, 0, 0] 5) v1 = [1, 1, 0, 0, 1] 6) v1 = [1, 1, 0, 0] 7) v1 = [0, 0, 1, 1] 8) v1 = [0, 0, 1, 1, 1, 1, 1, 1]
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2187 | C++11 |
specializations for
bool
lacked
emplace
and
emplace_back
member functions
|
added |