std:: vector<bool>
|
Definido en el encabezado
<vector>
|
||
|
template
<
class
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 > ::referencecomo 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
|
|
||||
const_iterator
|
|
||||
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>
)
|
|
|
(C++23)
|
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 |
|
|
(C++11)
|
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>
)
|
|
(C++11)
|
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>
)
|
|
|
(C++23)
|
inserta un rango de elementos
(función miembro pública de
std::vector<T,Allocator>
)
|
|
(C++23)
|
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>
)
|
|
|
(C++11)
|
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>
)
|
|
|
|
|
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
|
(C++11)
|
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 |