Partilhar via


Classe vector<bool>

A classe vector<bool> é uma especialização parcial de vector para elementos do tipo bool. Ela tem um alocador para o tipo subjacente que é usado pela especialização, que fornece otimização de espaço ao armazenar um valor bool por bit.

Sintaxe

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

Comentários

Essa especialização de modelo de classe se comporta como vector, exceto por diferenças explicadas neste artigo.

As operações que lidam com o tipo bool correspondem a valores no armazenamento do contêiner. allocator_traits::construct não é usado para construir esses valores.

Typedefs

Nome do tipo Descrição
const_pointer Um typedef para um const_iterator que pode funcionar como um ponteiro de constante para um elemento booliano do vector<bool>.
const_reference Um typedef para bool. Depois da inicialização, ele não observa atualizações no valor original.
pointer Um typedef para um iterator que pode funcionar como um ponteiro para um elemento booliano do vector<bool>.

Funções de membro

Função de membro Descrição
flip Inverte todos os bits no vector<bool>.
swap Troca os elementos de dois vector<bool>s.
operator[] Retorna uma referência simulada para o elemento vector<bool> em uma posição especificada.
at Funciona da mesma forma que a função não especializada vector::at, exceto que ela usa a classe de proxy vector<bool>::reference. Consulte também operator[].
front Funciona da mesma forma que a função não especializada vector::front, exceto que ela usa a classe de proxy vector<bool>::reference. Consulte também operator[].
back Funciona da mesma forma que a função não especializada vector::back, exceto que ela usa a classe de proxy vector<bool>::reference. Consulte também operator[].

Classe proxy

Nome Descrição
Classe vector<bool>::reference Uma classe que atua como um proxy para simular o comportamento de bool& e cujos objetos podem fornecer referências a elementos (bits únicos) em um objeto vector<bool>.

Requisitos

Cabeçalho: <vector>

Namespace: std

vector<bool>::const_pointer

Um tipo que descreve um objeto que pode servir como um ponteiro de constante para um elemento booliano da sequência contida pelo objeto vector<bool>.

typedef const_iterator const_pointer;

vector<bool>::const_reference

Um tipo que descreve um objeto que pode servir como uma referência de constante para um elemento booliano da sequência contida pelo objeto vector<bool>.

typedef bool const_reference;

Comentários

Para mais informações e exemplos de código, consulte vector<bool>::reference::operator=.

vector<bool>::flip

Inverte todos os bits em um vector<bool>.

void flip();

Exemplo

// 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[]

Retorna uma referência simulada para o elemento vector<bool> em uma posição especificada.

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

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

Parâmetros

Pos
A posição do elemento vector<bool>.

Valor de retorno

Um objeto vector<bool>::reference ou vector<bool>::const_reference que contém o valor do elemento indexado.

Se a posição especificada for maior ou igual ao tamanho do contêiner, o resultado será indefinido.

Comentários

Se você compilar com _ITERATOR_DEBUG_LEVEL definido, um erro de tempo de execução ocorrerá se você tentar acessar um elemento fora dos limites do vetor. Para obter mais informações, consulte Iteradores verificados.

Exemplo

Este exemplo de código mostra o uso correto e dois erros comuns de vector<bool>::operator[] codificação, que são comentados. Esses erros causam erros porque o vector<bool>::reference endereço do objeto que vector<bool>::operator[] retorna não pode ser usado.

// 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

Um tipo que descreve um objeto que pode servir como um ponteiro para um elemento booliano da sequência contida pelo objeto vector<bool>.

typedef iterator pointer;

Classe vector<bool>::reference

A classe vector<bool>::reference é uma classe proxy fornecida pela classe vector<bool> para simular bool&.

Comentários

Uma referência simulada é necessária porque o C++ não permite nativamente referências diretas aos bits. vector<bool> usa apenas um bit por elemento, que pode ser referenciado usando essa classe proxy. No entanto, a simulação de referência não é concluída porque determinadas atribuições não são válidas. Por exemplo, como o vector<bool>::reference endereço do objeto não pode ser usado, o seguinte código que usa vector<bool>::operator[] não está correto:

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

Inverte o valor booliano de um elemento vector<bool> referenciado.

void flip();

Exemplo

// 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

Fornece uma conversão implícita de vector<bool>::reference em bool.

operator bool() const;

Valor de retorno

O valor booliano do elemento do objeto vector<bool>.

Comentários

O vector<bool> objeto não pode ser modificado por esse operador.

vector<bool>::reference::operator=

Atribui um valor booliano a um bit ou o valor mantido por um elemento referenciado para um bit.

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

Parâmetros

Right
A referência de elemento cujo valor deve ser atribuído ao bit.

Val
O valor booliano a ser atribuído ao bit.

Exemplo

// 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

A função membro estática que troca dois elementos de vetores boolianos (vector<bool>) usando a classe de proxy vector<bool>::reference.

static void swap(
    reference Left,
    reference Right);

Parâmetros

Left
O elemento a ser trocado pelo elemento Right.

Right
O elemento a ser trocado pelo elemento Left.

Comentários

Essa sobrecarga oferece suporte aos requisitos especiais de proxy do vector<bool>. vector::swap tem a mesma funcionalidade que a sobrecarga de argumento único de vector<bool>::swap().

Confira também

Acesso Thread-Safe na Biblioteca Padrão C++
Referência da biblioteca padrão C++