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>)
assign_range
(C++23)
присваивает контейнеру диапазон значений
(открытая функция-член 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>)
insert_range
(C++23)
вставляет диапазон элементов
(открытая функция-член std::vector<T,Allocator>)
append_range
(C++23)
добавляет диапазон элементов в конец
(открытая функция-член 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>::references
(открытая статическая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух vector
(шаблон функции)
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> не обязательно соответствует всем требованиям Container или SequenceContainer. Например, поскольку std::vector<bool>::iterator определяется реализацией, он может не удовлетворять требованиям LegacyForwardIterator. Использование таких алгоритмов, как std::search, требующих LegacyForwardIterators, может привести к ошибкам во время компиляции или выполнения.

Версия vector из Boost.Container не специализируется для 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; // creates an empty vector of boolean values
    println("1) v1", v1);

    std::vector<bool> v2{0, 1, 1, 0, 1}; // creates filled vector
    println("2) v2", v2);

    v1 = v2; // copies v2 to v1
    println("3) v1", v1);

    assert(v1.size() == v2.size()); // checks that v1 and v2 sizes are equal
    assert(v1.front() == false); // accesses first element, equivalent to:
    assert(v1[0] == false);
    assert(v1.back() == true); // accesses last element, equivalent to:
    assert(v1[v1.size() - 1] == true);

    v1 = {true, true, false, false}; // assigns an initializer list
    println("4) v1", v1);

    v1.push_back(true); // adds one element to the end
    println("5) v1", v1);

    v1.pop_back(); // removes one element from the end
    println("6) v1", v1);

    v1.flip(); // flips all elements
    println("7) v1", v1);

    v1.resize(8, true); // resizes v1; new elements are set to “true”
    println("8) v1", v1);

    v1.clear(); // erases v1
    assert(v1.empty()); // checks that v1 is empty
}

Вывод:

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++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
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/cpp/container/vector_bool

Spec-Zone.ru

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