2010-06-28 21 views
12

Quiero hacer un conjunto de bits en C++. Hice un poco de investigación. Todos los ejemplos que he encontrado en este aspecto:¿Define el tamaño del conjunto de bits en la inicialización?

bitset<6> myBitset; 
// do something with it 

Pero no sé el tamaño de la bitset cuando defino la variable de mi clase:

#include <bitset> 
class Test 
{ 
public: 
    std::bitset *myBitset; 
} 

Esto no se compilará ...

y la inicialización como esto tampoco funciona:

int size = getDependentSizeForBitset(); 
myBitset = new bitset<size>(); 
+1

No tengo idea de qué es esto, pero siempre puedes usar un vector si no es demasiado grande. Esta es especialmente una buena opción si trabaja en un entorno que no permite aumentar (es decir, un trabajo horrible). – Cam

+2

Eso debería ser una respuesta, no un comentario. –

+1

std :: vector no solo es más grande, sino significativamente más lento (~ 5x) en la aplicación que me llevó a esta pregunta. – sdenham

Respuesta

19

Boost tiene un dynamic_bitset que puede usar.

Como alternativa, puede usar un vector<bool>, que (desafortunadamente) está especializado para actuar como un conjunto de bits. Esto causa mucha confusión y, en general, se considera una mala idea. Pero así es como funciona, así que si eso es lo que necesitas, podrías usarlo, supongo.

+0

+1. Es una pena que el vector tenga esa especialización en lugar de solo una clase separada. No es como si fuera más fácil para los vendedores implementarlo como una especialización: simplemente parece francamente tonto. – stinky472

+0

sí. Desafortunadamente, creo que el comité se ha resistido a todas las propuestas para desaprobarlo. – jalf

6
+0

Gracias. Pero estoy tratando de mantener mi aplicación lo más simple posible. Entonces, voy por 'vector '. De lo contrario, tendré que instalar la biblioteca adicional ... –

+0

Boost :: dynamic_bitset está completamente implementado en archivos de encabezado. No hay biblioteca adicional para instalar. –

1

Deberías echarle un vistazo para aumentar dynamic_bitset.

1

Lo que dices al principio no es cierto. Los "ejemplos que encontraste" no se veían como los publicaste. Es imposible usar un valor no constante para parametrizar una plantilla. Entonces, tu primer ejemplo no es válido. Solo las expresiones constantes pueden servir como argumentos sin tipo para una plantilla. Es decir. el argumento sin tipo tiene que ser una constante en tiempo de compilación.

Parece que desea crear un conjunto de bits cuyo tamaño no sea una constante en tiempo de compilación. En este caso, la plantilla bitset está fuera de duda. Necesita una implementación de conjuntos de bits de tamaño de tiempo de ejecución. Por ejemplo, puede usar std::vector<bool> - en muchas (si no todas) las implementaciones esta plantilla está especializada para implementar una matriz empaquetada de valores booleanos, donde cada elemento ocupa un bit (a diferencia de un objeto bool).

0

bitset requiere tamaño como un parámetro de plantilla, lo que significa que el tamaño debe poder determinarse en tiempo de compilación. No puede basarse en una condición de tiempo de ejecución, como la entrada del usuario.

Para eso, debe buscar en std :: vector o boost :: dynamic_bitset. std :: vector es una instanciación de plantilla especializada que utiliza un bit por elemento. A diferencia del conjunto de bits, puede ser de tamaño dinámico.

Cuestiones relacionadas