Namespaces
Variants

std:: vector<bool>

From cppreference.net
Определено в заголовке <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 определяется реализацией
прокси-класс, представляющий ссылку на отдельное значение 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> )
присваивает значения контейнеру
(публичная функция-член 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> )
Итераторы
возвращает итератор на начало
(публичная функция-член std::vector<T,Allocator> )
(C++11)
возвращает итератор на конец
(публичная функция-член 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> )
резервирует память
(публичная функция-член 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> )
удаляет элементы
(публичная функция-член std::vector<T,Allocator> )
добавляет элемент в конец
(публичная функция-член std::vector<T,Allocator> )
создаёт элемент на месте в конце контейнера
(публичная функция-член std::vector<T,Allocator> )
удаляет последний элемент
(публичная функция-член std::vector<T,Allocator> )
изменяет количество хранимых элементов
(публичная функция-член std::vector<T,Allocator> )
обменивает содержимое
(публичная функция-член std::vector<T,Allocator> )
vector<bool> специфические модификаторы
инвертирует все биты
(публичная функция-член)
[static]
обменивает два std::vector<bool>:: reference s
(публичная статическая функция-член)

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

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

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

поддержка хеширования для 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