Pergunta

dinâmico bitset

Eu tenho um caso de uso onde eu preciso para preencher

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

Can você sugere a respeito de como fazer isto. Então eu preciso para chegar a uma função

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

     //populate bitMap from a string buffer
}
Foi útil?

Solução

Se você tiver dados binários como esta:

string buffer = "0101001111011";

Você deseja inicializá-lo como este (Acontece que há um construtor que trata neste caso):

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

Se você quiser os dados brutos, utilize o iterador construtor :

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

Estes acabam alocando a memória necessária duas vezes, então você pode ser melhor fora com uma alocação de pilha e um swap. Ou você só pode esperar até C ++ 0x e deixe a semântica movimento fazer a sua coisa.

// 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);
}

Edit: Para esclarecer por que as primeiras versões alocar o dobro da memória:

Dê uma olhada em outra maneira de escrever a primeira versão:

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
}

Se você colocar essas duas linhas juntas, como no primeiro exemplo, você ainda obter uma temporária construída na pilha, seguido de uma atribuição. Em 1. impulso precisa alocar memória suficiente para todo o conjunto de bits. Em 2, boost precisa alocar memória novamente o suficiente para manter esse mesmo conjunto de bit e, em seguida, copiar os valores acima. É possível que bitmap já tem memória suficiente, por isso não pode sempre necessidade de realocar, mas também é possível que ele irá liberar sua memória apoio e realocar a partir do zero de qualquer maneira.

A maioria dos recipientes que se encaixam no molde STL também têm uma função swap que você pode usar no lugar de atribuição quando você pretende jogar fora um lado do swap. Estes são geralmente O (1) e não jogar, pois muitas vezes envolve apenas trocando alguns ponteiros. Veja este GotW para outra razão pela qual estes são úteis.

Em C ++ 0X, você vai ser capaz de usar a atribuição, e ainda obter as vantagens de swap. Desde que você pode sobrecarregar em valores de r (como o temporário), o know recipiente que quando você atribui um temporária, ele sabe que pode canibalizar a temperatura e, basicamente, fazer uma troca. O Blog Visual Studio Team cobriu rvalues ??e movimento semântica muito bem aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top