Класс vector<bool>

Класс vector<bool> является частичной специализацией vector для элементов типа bool. Он имеет распределитель базового типа, который используется специализацией, обеспечивающей оптимизацию пространства путем сохранения одного значения bool на бит.

Синтаксис

template <class Allocator = allocator<bool>>
class vector<bool, Allocator>

Замечания

Эта специализация шаблона класса действует так vector, за исключением различий, описанных в этой статье.

Операции, которые работают с типом bool, соответствуют значениям в хранилище контейнера. allocator_traits::construct не используется для создания этих значений.

Определения типов

Введите имя Description
const_pointer Typedef для итератора const_iterator, который может применяться как указатель константы на логический элемент vector<bool>.
const_reference Typedef для bool. После инициализации он не наблюдает обновлений исходного значения.
pointer Typedef для итератора iterator, который может применяться как указатель на логический элемент vector<bool>.

Функции элементов

Функция-член Description
flip Обращает все биты в vector<bool>.
swap Выполняет обмен элементами между двумя объектами vector<bool>.
operator[] Возвращает смоделированной ссылку на элемент vector<bool> в указанную позицию.
at Функции, те же, что и невидимая vectorфункция ::at, за исключением того, что она использует прокси-класс vector<bool>::reference. См. также operator[].
front Функции, те же, что и невидимая vectorфункция ::front, за исключением того, что она использует прокси-класс vector<bool>::reference. См. также operator[].
back Функции, те же, что и невидимая vectorфункция ::back, за исключением того, что она использует прокси-класс vector<bool>::reference. См. также operator[].

Прокси-класс

Имя Описание
vector<bool>::reference Класса Класс, действующий как прокси для моделирования поведения bool&, объекты которого могут предоставлять ссылки на элементы (одиночные биты) в пределах объекта vector<bool>.

Требования

Заголовок: <vector>

Пространство именstd:

vector<bool>::const_pointer

Тип, описывающий объект, который можно использовать в качестве константного указателя на логический элемент последовательности, содержащейся объектом vector<bool>.

typedef const_iterator const_pointer;

vector<bool>::const_reference

Тип, описывающий объект, который можно использовать в качестве константной ссылки на логический элемент последовательности, содержащейся объектом vector<bool>.

typedef bool const_reference;

Замечания

Дополнительные сведения и примеры кода см. в разделе vector<bool>::reference::operator=.

vector<bool>::flip

Реверсирует все биты в vector<bool>.

void flip();

Пример

// vector_bool_flip.cpp
// compile with: /EHsc /W4
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha; // format output for subsequent code

    vector<bool> vb = { true, false, false, true, true };
    cout << "The vector is:" << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;

    vb.flip();

    cout << "The flipped vector is:" << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;
}

vector<bool>::operator[]

Возвращает смоделированной ссылку на элемент vector<bool> в указанную позицию.

vector<bool>::reference operator[](size_type Pos);

vector&<bool&>::const_reference operator[](size_type Pos) const;

Параметры

Pos
Позиция элемента vector<bool>.

Возвращаемое значение

Объект vector<bool>::reference или vector<bool>::const_reference объект, содержащий значение индексированного элемента.

Если заданная позиция больше или равна размеру контейнера, результат не определен.

Замечания

При компиляции с набором _ITERATOR_DEBUG_LEVEL возникает ошибка во время выполнения, если предпринимается попытка доступа к элементу за пределами вектора. Дополнительные сведения см. в разделе Проверяемые итераторы.

Пример

В этом примере кода показано правильное использование vector<bool>::operator[] и две распространенные ошибки кодирования, которые закомментированы. Эти ошибки вызывают ошибки, так как адрес объекта, возвращаемого vector<bool>::referencevector<bool>::operator[] невозможно.

// cl.exe /EHsc /nologo /W4 /MTd
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha;
    vector<bool> vb;

    vb.push_back(true);
    vb.push_back(false);

    //    bool* pb = &vb[1]; // conversion error - do not use
    //    bool& refb = vb[1];   // conversion error - do not use
    bool hold = vb[1];
    cout << "The second element of vb is " << vb[1] << endl;
    cout << "The held value from the second element of vb is " << hold << endl;

    // Note this doesn't modify hold.
    vb[1] = true;
    cout << "The second element of vb is " << vb[1] << endl;
    cout << "The held value from the second element of vb is " << hold << endl;
}
The second element of vb is false
The held value from the second element of vb is false
The second element of vb is true
The held value from the second element of vb is false

vector<bool>::pointer

Тип, описывающий объект, который можно использовать в качестве указателя на логический элемент последовательности, содержащейся объектом vector<bool>.

typedef iterator pointer;

Класс vector<bool>::reference

Класс vector<bool>::reference является прокси-классом, предоставляемым классомvector<bool> для имитации.bool&

Замечания

Смоделированная ссылка требуется, так как C++ не разрешает прямые ссылки на биты. vector<bool> использует только один бит на элемент, ссылку на который можно создать с помощью данного класса прокси. Однако имитация ссылок не завершена, так как некоторые назначения недопустимы. Например, так как адрес vector<bool>::reference объекта не может быть принят, следующий код, который используется vector<bool>::operator[] , не является правильным:

vector<bool> vb;
//...
bool* pb = &vb[1]; // conversion error - do not use
bool& refb = vb[1];   // conversion error - do not use

vector<bool>::reference::flip

Инвертирует логическое значение ссылочного vector<bool> элемента.

void flip();

Пример

// vector_bool_ref_flip.cpp
// compile with: /EHsc /W4
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha;

    vector<bool> vb = { true, false, false, true, true };

    cout << "The vector is: " << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;

    vector<bool>::reference vbref = vb.front();
    vbref.flip();

    cout << "The vector with first element flipped is: " << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;
}
The vector is:
    true false false true true
The vector with first element flipped is:
    false false false true true

vector<bool>::reference::operator bool

Обеспечивает неявное преобразование из vector<bool>::reference в bool.

operator bool() const;

Возвращаемое значение

Логическое значение элемента vector<bool> объекта.

Замечания

Объект vector<bool> нельзя изменить этим оператором.

vector<bool>::reference::operator=

Присваивает биту логическое значение или значение, которое содержит элемент со ссылкой.

reference& operator=(const reference& Right);
reference& operator=(bool Val);

Параметры

Right
Ссылка на элемент, значение которого должно быть присвоено биту.

Val
Логическое значение, которое должно быть присвоено биту.

Пример

// vector_bool_ref_op_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>
#include <string>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    cout << boolalpha;

    vector<bool> vb = { true, false, false, true, true };

    print("The vector is: ", vb);

    // Invoke vector<bool>::reference::operator=()
    vector<bool>::reference refelem1 = vb[0];
    vector<bool>::reference refelem2 = vb[1];
    vector<bool>::reference refelem3 = vb[2];

    bool b1 = refelem1;
    bool b2 = refelem2;
    bool b3 = refelem3;
    cout << "The original value of the 1st element stored in a bool: " << b1 << endl;
    cout << "The original value of the 2nd element stored in a bool: " << b2 << endl;
    cout << "The original value of the 3rd element stored in a bool: " << b3 << endl;
    cout << endl;

    refelem2 = refelem1;

    print("The vector after assigning refelem1 to refelem2 is now: ", vb);

    refelem3 = true;

    print("The vector after assigning false to refelem1 is now: ", vb);

    // The initial values are still stored in the bool variables and remained unchanged
    cout << "The original value of the 1st element still stored in a bool: " << b1 << endl;
    cout << "The original value of the 2nd element still stored in a bool: " << b2 << endl;
    cout << "The original value of the 3rd element still stored in a bool: " << b3 << endl;
    cout << endl;
}
The vector is: true false false true true
The original value of the 1st element stored in a bool: true
The original value of the 2nd element stored in a bool: false
The original value of the 3rd element stored in a bool: false

The vector after assigning refelem1 to refelem2 is now: true true false true true
The vector after assigning false to refelem1 is now: true true true true true
The original value of the 1st element still stored in a bool: true
The original value of the 2nd element still stored in a bool: false
The original value of the 3rd element still stored in a bool: false

vector<bool>::swap

Статическая функция-член, которая обменивается двумя элементами логических векторов ( vector<bool>) с помощью прокси-класса vector<bool>::reference.

static void swap(
    reference Left,
    reference Right);

Параметры

Left
Элемент, который требуется поменять местами с элементом Right.

Right
Элемент, который требуется поменять местами с элементом Left.

Замечания

Данная перегрузка поддерживает специальные прокси-требования vector<bool>. vector::swap имеет те же функции, что и перегрузка vector<bool>::swap()с одним аргументом.

См. также

Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++