Класс 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>::reference
vector<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++