Namespaces
Variants

std:: vector<bool>

From cppreference.net
Definido en el encabezado <vector>
template <

class Allocator

> class vector < bool , Allocator > ;

std :: vector < bool > es una especialización potencialmente eficiente en espacio de std::vector para el tipo bool .

La manera en la que std :: vector < bool > se hace eficiente en espacio (así como si está optimizado en absoluto) está definido por la implementación. Una optimización potencial implica agrupar los elementos del vector de manera que cada elemento ocupe un solo bit en lugar de sizeof ( bool ) bytes.

std :: vector < bool > se comporta de manera similar a std::vector , pero para ser eficiente en espacio, este:

  • No necesariamente almacena sus elementos como un array contiguo.
  • Expone la clase std :: vector < bool > :: reference como método para acceder a bits individuales. En particular, los objetos de esta clase son devueltos por operator[] por valor.
  • No utiliza std :: allocator_traits :: construct para construir valores de bits.
  • No garantiza que diferentes elementos en el mismo contenedor puedan ser modificados concurrentemente por diferentes hilos.

Contenidos

Tipos de miembros

Tipo de miembro Definición
value_type bool
allocator_type Allocator
size_type definido por la implementación
difference_type definido por la implementación
clase proxy que representa una referencia a un único bool
(clase)
const_reference bool
pointer definido por la implementación
const_pointer definido por la implementación
iterator

definido por la implementación

(hasta C++20)

definido por la implementación ConstexprIterator

(desde C++20)
const_iterator

definido por la implementación

(hasta C++20)

definido por la implementación ConstexprIterator

(desde C++20)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

Funciones miembro

construye el vector
(función miembro pública de std::vector<T,Allocator> )
destruye el vector
(función miembro pública de std::vector<T,Allocator> )
asigna valores al contenedor
(función miembro pública de std::vector<T,Allocator> )
asigna valores al contenedor
(función miembro pública de std::vector<T,Allocator> )
asigna un rango de valores al contenedor
(función miembro pública de std::vector<T,Allocator> )
devuelve el asignador asociado
(función miembro pública de std::vector<T,Allocator> )
Acceso a elementos
accede al elemento especificado con verificación de límites
(función miembro pública de std::vector<T,Allocator> )
acceder al elemento especificado
(función miembro pública de std::vector<T,Allocator> )
acceder al primer elemento
(función miembro pública de std::vector<T,Allocator> )
acceder al último elemento
(función miembro pública de std::vector<T,Allocator> )
Iteradores
devuelve un iterador al inicio
(función miembro pública de std::vector<T,Allocator> )
(C++11)
devuelve un iterador al final
(función miembro pública de std::vector<T,Allocator> )
devuelve un iterador inverso al principio
(función miembro pública de std::vector<T,Allocator> )
(C++11)
devuelve un iterador inverso al final
(función miembro pública de std::vector<T,Allocator> )
Capacidad
verifica si el contenedor está vacío
(función miembro pública de std::vector<T,Allocator> )
devuelve el número de elementos
(función miembro pública de std::vector<T,Allocator> )
devuelve el número máximo posible de elementos
(función miembro pública de std::vector<T,Allocator> )
reserva almacenamiento
(función miembro pública de std::vector<T,Allocator> )
devuelve el número de elementos que pueden almacenarse en la memoria actualmente asignada
(función miembro pública de std::vector<T,Allocator> )
Modificadores
borra el contenido
(función miembro pública de std::vector<T,Allocator> )
inserta elementos
(función miembro pública de std::vector<T,Allocator> )
inserta un rango de elementos
(función miembro pública de std::vector<T,Allocator> )
agrega un rango de elementos al final
(función miembro pública de std::vector<T,Allocator> )
(C++11)
construye elementos en el lugar
(función miembro pública de std::vector<T,Allocator> )
elimina elementos
(función miembro pública de std::vector<T,Allocator> )
agrega un elemento al final
(función miembro pública de std::vector<T,Allocator> )
construye un elemento en el lugar al final
(función miembro pública de std::vector<T,Allocator> )
elimina el último elemento
(función miembro pública de std::vector<T,Allocator> )
cambia el número de elementos almacenados
(función miembro pública de std::vector<T,Allocator> )
intercambia los contenidos
(función miembro pública de std::vector<T,Allocator> )
vector<bool> modificadores específicos
invierte todos los bits
(función miembro pública)
[static]
intercambia dos std::vector<bool>:: reference s
(función miembro pública estática)

Funciones no miembro

(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores de dos vector s
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
elimina todos los elementos que cumplen criterios específicos
(plantilla de función)

Clases auxiliares

soporte de hash para std :: vector < bool >
(especialización de plantilla de clase)

Guías de deducción (C++17)

Notas

Si el tamaño del bitset se conoce en tiempo de compilación, std::bitset puede utilizarse, el cual ofrece un conjunto más rico de funciones miembro. Además, boost::dynamic_bitset existe como alternativa a std :: vector < bool > .

Dado que su representación puede estar optimizada, std :: vector < bool > no necesariamente cumple con todos los requisitos de Container o SequenceContainer . Por ejemplo, debido a que std :: vector < bool > :: iterator está definido por la implementación, puede no satisfacer el requisito de LegacyForwardIterator . El uso de algoritmos como std::search que requieren LegacyForwardIterator s puede resultar en errores en tiempo de compilación o en tiempo de ejecución .

La versión Boost.Container de vector no especializa para bool .

Macro de prueba de características Valor Estándar Característica
__cpp_lib_containers_ranges 202202L (C++23) Construcción e inserción de rangos para contenedores

Ejemplo

#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; // crea un vector vacío de valores booleanos
    println("1) v1", v1);
    std::vector<bool> v2{0, 1, 1, 0, 1}; // crea un vector lleno
    println("2) v2", v2);
    v1 = v2; // copia v2 a v1
    println("3) v1", v1);
    assert(v1.size() == v2.size()); // verifica que los tamaños de v1 y v2 sean iguales
    assert(v1.front() == false); // accede al primer elemento, equivalente a:
    assert(v1[0] == false);
    assert(v1.back() == true); // accede al último elemento, equivalente a:
    assert(v1[v1.size() - 1] == true);
    v1 = {true, true, false, false}; // asigna una lista de inicialización
    println("4) v1", v1);
    v1.push_back(true); // añade un elemento al final
    println("5) v1", v1);
    v1.pop_back(); // elimina un elemento del final
    println("6) v1", v1);
    v1.flip(); // invierte todos los elementos
    println("7) v1", v1);
    v1.resize(8, true); // redimensiona v1; los nuevos elementos se establecen en "true"
    println("8) v1", v1);
    v1.clear(); // borra v1
    assert(v1.empty()); // verifica que v1 esté vacío
}

Salida:

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]

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2187 C++11 las especializaciones para bool carecían de las funciones miembro emplace y emplace_back añadidas