Domanda

Set di bit dinamico

Ho un caso d'uso in cui devo popolare

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

Potete suggerire come procedere?Quindi devo inventare una funzione

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

     //populate bitMap from a string buffer
}
È stato utile?

Soluzione

Se hai dati binari come questi:

string buffer = "0101001111011";

Vuoi inizializzarlo in questo modo (si scopre che c'è un file costruttore che si occupa di questo caso):

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

Se vuoi i dati grezzi, usa il file costruttore dell'iteratore:

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

Questi finiscono per allocare la memoria necessaria due volte, quindi potresti stare meglio con un'allocazione dello stack e uno scambio.Oppure puoi semplicemente aspettare fino al C++0x e lasciare che la semantica dello spostamento faccia il suo dovere.

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

Modificare:Per chiarire perché le prime versioni allocano il doppio della memoria:

Dai un'occhiata a un altro modo di scrivere la prima versione:

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 metti insieme queste due righe, come nel primo esempio, otterrai comunque una costruzione temporanea sullo stack, seguita da un'assegnazione.In 1.boost deve allocare memoria sufficiente per l'intero set di bit.In 2, boost deve allocare nuovamente memoria sufficiente per contenere lo stesso set di bit e quindi copiare i valori.È possibile che bitMap disponga già di memoria sufficiente, quindi potrebbe non essere sempre necessario riallocarla, ma è anche possibile che liberi la memoria di backup e la riallochi comunque da zero.

La maggior parte dei contenitori che si adattano allo stampo STL hanno anche una funzione di scambio che puoi utilizzare al posto dell'assegnazione quando intendi eliminare un lato dello scambio.Di solito sono O(1) e non lanciabili poiché spesso comportano solo lo scambio di alcuni puntatori.Guarda questo Ho capito per un altro motivo per cui sono utili.

In C++0X potrai utilizzare l'assegnazione e ottenere comunque i vantaggi dello scambio.Poiché puoi sovraccaricare i valori r (come il temporaneo), il contenitore sa che quando assegni un temporaneo, sa che può cannibalizzare la temperatura e fondamentalmente eseguire uno scambio.Il blog del team di Visual Studio ha trattato gli rvalue e la semantica di spostamento abbastanza bene qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top