Question

Jeu de bits dynamique

J'ai un cas d'utilisation où je dois remplir

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

Pouvez-vous suggérer comment procéder.Je dois donc trouver une fonction

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

     //populate bitMap from a string buffer
}
Était-ce utile?

La solution

Si vous avez des données binaires comme celle-ci :

string buffer = "0101001111011";

Vous voulez l'initialiser comme ceci (il s'avère qu'il y a un constructeur qui gère ce cas):

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

Si vous voulez les données brutes, utilisez le constructeur d'itérateur:

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

Ceux-ci finissent par allouer la mémoire nécessaire deux fois, vous pourriez donc être mieux loti avec une allocation de pile et un échange.Ou vous pouvez simplement attendre C++0x et laisser la sémantique de déplacement faire son travail.

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

Modifier:Pour clarifier pourquoi les premières versions allouent deux fois plus de mémoire :

Jetez un œil à une autre façon d’écrire la première version :

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 vous mettez ces deux lignes ensemble, comme dans le premier exemple, vous obtenez toujours une construction temporaire sur la pile, suivie d'une affectation.En 1.boost doit allouer suffisamment de mémoire pour l’ensemble des bits.En 2, boost doit allouer à nouveau suffisamment de mémoire pour contenir le même ensemble de bits, puis copier les valeurs.Il est possible que bitMap dispose déjà de suffisamment de mémoire, il n'est donc pas toujours nécessaire de le réaffecter, mais il est également possible qu'il libère sa mémoire de sauvegarde et le réaffecte de toute façon à partir de zéro.

La plupart des conteneurs adaptés au moule stl ont également une fonction d'échange que vous pouvez utiliser à la place de l'affectation lorsque vous avez l'intention de jeter un côté de l'échange.Il s'agit généralement de O(1) et de non-lancement car ils impliquent souvent simplement d'échanger certains pointeurs.Regarde ça GotW pour une autre raison pour laquelle ils sont utiles.

En C++0X, vous pourrez utiliser l'affectation tout en bénéficiant des avantages du swap.Puisque vous pouvez surcharger les valeurs R (comme le temporaire), le conteneur sait que lorsque vous attribuez un temporaire, il sait qu'il peut cannibaliser le temporaire et essentiellement effectuer un échange.Le blog de l'équipe Visual Studio a couvert les valeurs et la sémantique de déplacement très bien ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top