Comment stocker un tableau de bits en C ++?
Quelle est la meilleure façon de stocker un tableau de bits en C++ (pas de coup de pouce, seulement des conteneurs standard), soit, par exemple, une allocation de volume bitmap?
J'ai pensé std::vector<bool>
était une bonne idée, mais apparemment, c'est Mal et obsolètedonc, il y a un meilleur choix?
Aussi:
Si j'ai un tableau d'octets en mémoire, comment pourrais-je aller sur la copie du recommandé conteneur?
(J'ai du mal à déterminer ce pour vector<bool>
.)
source d'informationauteur Mehrdad | 2011-10-20
Vous devez vous connecter pour publier un commentaire.
un char tableau et puis masquage en 0x1 va agir comme un tableau de bits.
Exemple:
bien sûr, ces opérations sont généralement relativement lent, mais si la mémoire est un problème c'est une manière décente pour aller. J'ai choisi de char pour cela de réduire le nombre de changements nécessaires. Toutefois, il peut être encore plus rapide avec des entiers.
Juste poster ce que 6 ans plus tard pour la postérité: comme l'un des intervenants a dit, je suis venu à la conclusion que c'est parfaitement bien à utiliser
std::vector<bool>
comme son propre type spécialisé. La seule chose que vous devez faire attention est de ne pas le traiter comme un standardbool
conteneur, car il n'est pas.À la vanille C++, il y a std::bitset.
Matt Austern a un bel article sur son utilisation.
Aussi:
Si votre tableau d'octets (tableau de bits?) s'inscrit dans un unsigned long, vous pouvez l'affecter à un std::bitset directement:
Je pense que certains points sur le site, vous liés ne sont pas correctes. Sur presque tous les ordinateurs de la taille d'un bit est vraiment un octet (même en tant que personnage) parce que les ordinateurs ne s'adresse qu'à un octet n'est pas un peu à l'intérieur d'un octet (si vous pouvez alors qu'un huitième de l'espace d'adressage que vous avez actuellement avec octets)
Je voudrais juste utiliser un octet pour votre vecteur parce qu'il donne à d'autres personnes qui lisent votre code une meilleure idée de l'empreinte mémoire de votre application.
Ram est très abondante dans les ordinateurs modernes, de sorte que vous pouvez être en mesure d'utiliser la plus grande partie intégrante types, mais de façon réaliste, vous ne pouvez pas aller plus petites qu'un octet.
Pour copier des données à partir d'un récipient à l'autre d'abord créer un itérateur pour le conteneur
vector::iterator myItr = myVector.begin()
et parcourir le vecteur avec une boucle while ou for la boucle jusqu'à ce que myItr atteint myVector.fin().
Par exemple
La std::bitset va faire, aussi longtemps que votre tableau de bits est de taille fixe.
Comme une note de côté, il ya aussi std::dynamic_bitset, mais je ne suis pas sûr à 100% qu'il l'a fait dans la norme.