values - ¿Es aceptable el uso de los objetos std:: vector<bool> en C++, o debería usar una alternativa?
dato booleano en c++ (7)
Hay boost.dynamic_bitset que es casi idéntico a std :: bitset, excepto que su tamaño se da en tiempo de ejecución. Si no está interesado en impulsar la dependencia, su código fuente (que está completamente contenido en su archivo de encabezado) podría al menos dar más ideas sobre cómo se podría escribir dicho contenedor.
Estoy trabajando con una cantidad de bits definida por el usuario (estoy sosteniendo una matriz tridimensional de bits, por lo que el tamaño aumenta de forma cúbica, asuma no menos de 512 bits), y necesito voltearlos individualmente. En este momento, solo en una computadora, estoy usando el tipo bool
, ya que la memoria no es un problema. Planeo mover el código a un microcontrolador en el futuro, por lo que los requisitos de potencia y memoria de procesamiento pueden ser un problema. Ahora mismo, solo quiero velocidad.
Luego encontré el objeto std::bitset
del C ++ STL , pero no puedo definir el tamaño de un conjunto de bits en tiempo de ejecución. Luego encontré que std::vector<byte>
tiene un inicializador especial para almacenarlos como bits (en lugar de bytes completos, o 4 bytes) pero luego encontré esta sección en Wikipedia:
La biblioteca estándar define una especialización de la plantilla
vector
parabool
. La descripción de esta especialización indica que la implementación debe incluir los elementos para que cadabool
solo use un bit de memoria. Esto es ampliamente considerado un error. [...] Existe un consenso general entre el Comité de estándares de C ++ y el Grupo de trabajo de bibliotecas de que elvector<bool>
debe ser desaprobado y eliminado posteriormente de la biblioteca estándar, mientras que la funcionalidad se reintroducirá con un nombre diferente.
Ahora, probablemente puedas ver mi deseo de usar un objeto vector<bool>
, pero después de leer eso, estoy considerando usar algo más. El único problema es que no estoy seguro de qué usar. Tenía curiosidad, sin embargo, por qué afirman que la funcionalidad debería ser reintroducida (aunque con un nombre diferente).
Entonces, mi pregunta es, ¿sería aceptable el uso de objetos vector<bool>
(siendo que son parte del STL)? ¿Son parte del estándar C ++?
Si su uso no es aceptable, ¿existe una solución alternativa aceptable (fuera de mí definiendo un contenedor especial yo mismo)? Tengo algunas ideas, pero solo tengo curiosidad si alguien tiene una mejor solución. Además, me gustaría evitar el uso de bibliotecas grandes (de nuevo, quiero eventualmente transferir este código a un microcontrolador).
La crítica es que el vector<bool>
es el único contenedor estándar que no se ajusta completamente a los requisitos de contenedor de la norma. Eso es un poco sorprendente.
Otro punto es que el vector<bool>
fuerza una optimización del espacio en todos (almacenando bits), cuando quizás algunos usuarios hubieran preferido una optimización de la velocidad.
Aparte de eso, la principal desviación es que el contenedor no puede devolver una referencia a sus miembros, porque no almacena ningún bools. Eso hará que el algoritmo de biblioteca estándar impar no compile para vector<bool>
.
Si puedes vivir con eso y se adapta a tus necesidades para todo lo demás, está bien usarlo.
No hay nada de malo con el uso correcto de vector<bool>
, al igual que no hay nada de malo con auto_ptr
, siempre y cuando conozca los inconvenientes y las sorpresas antes de continuar.
No hay nada de malo en vector<bool>
, excepto que no es equivalente a un vector<T>
T es el tipo de entero equivalente a bool. Esto solo se muestra en rendimiento (las CPU solo acceden a bytes a la vez, donde en un vector<bool>
cada elemento se almacena en un bit) y acceso a memoria (una referencia a un primer elemento de un vector<bool>
no es equivalente a array como con cualquier otro vector<T>
.
Es parte del estándar, desafortunadamente: ver la sección 23.3.7
(C ++ 0x FDIS).
Una alternativa podría ser BitMagic aunque no estoy seguro si funciona en cualquier otra arquitectura que no sea x86 (está muy optimizado con SIMD).
En "Effective STL", artículo 18 , Scott Meyers recomendó: "Evitar el uso de vector <bool>.":
Como contenedor STL, en realidad solo hay dos cosas incorrectas con vector <bool>. Primero, no es un contenedor STL. En segundo lugar, no contiene bools. Aparte de eso, no hay mucho que objetar.