Pregunta

Conjunto de bits dinámico

Tengo un caso de uso donde necesito completar

boost::dynamic_bitset<unsigned char> , from a std::string buffer.

¿Puede sugerir cómo hacer esto?Entonces necesito encontrar una función.

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset<unsigned char> & bitMap) {

     //populate bitMap from a string buffer
}
¿Fue útil?

Solución

Si tienes datos binarios como este:

string buffer = "0101001111011";

Quieres inicializarlo así (resulta que hay un constructor que maneja este caso):

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}

Si desea los datos sin procesar, utilice el constructor de iteradores:

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer.begin(), buffer.end());
}

Estos terminan asignando la memoria necesaria dos veces, por lo que sería mejor realizar una asignación de pila y un intercambio.O simplemente puedes esperar hasta C++0x y dejar que la semántica de movimiento haga lo suyo.

// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   boost::dynamic_bitset<unsigned char> localBitmap(buffer.begin(), buffer.end());
   bitMap.swap(localBitmap);
}

Editar:Para aclarar por qué las primeras versiones asignan el doble de memoria:

Eche un vistazo a otra forma de escribir la primera versión:

typedef boost::dynamic_bitset<unsigned char> bits; // just to shorten the examples.
void populateBitSet (std::string &buffer, bits &bitMap) 
{        
   const bits &temp = bits(buffer); // 1. initialize temporary
   bitMap = temp; // 2. Copy over data from temp to bitMap
}

Si junta estas dos líneas, como en el primer ejemplo, aún obtendrá un temporal construido en la pila, seguido de una asignación.En 1.boost necesita asignar suficiente memoria para todo el conjunto de bits.En 2, boost necesita asignar nuevamente suficiente memoria para contener ese mismo conjunto de bits y luego copiar los valores.Es posible que bitMap ya tenga suficiente memoria, por lo que no siempre será necesario reasignarla, pero también es posible que libere su memoria de respaldo y la reasigne desde cero de todos modos.

La mayoría de los contenedores que se ajustan al molde stl también tienen una función de intercambio que puede usar en lugar de la asignación cuando desea desechar un lado del intercambio.Generalmente son O(1) y no lanzables, ya que a menudo solo implican intercambiar algunos punteros.Mira esto tengow Hay otra razón por la que son útiles.

En C++0X, podrá utilizar la asignación y seguir obteniendo las ventajas del intercambio.Dado que puede sobrecargar los valores r (como los temporales), el contenedor sabe que cuando asigna un temporal, sabe que puede canibalizar la temperatura y básicamente hacer un intercambio.El blog del equipo de Visual Studio ha cubierto valores y semántica de movimiento. bastante bien aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top