Tableau de bits en C++
Lorsque vous travaillez avec un Projet d'Euler problèmes, j'ai souvent besoin de gros (> 10**7) tableau de bits.
Mon approche normale est l'une des:
bool* sieve = new bool[N];
bool sieve[N];
Lorsque N = 1 000 000 de mon programme utilise 1 méga-octet (8 * 1 000 000 bits).
Est-il un moyen plus efficace pour utiliser, stocker peu de tableaux de bool en c++?
- je mettre en œuvre tamis de l'algorithme à l'aide de vecteurs.. il peut tenir que de nombreux numéros.
Double Possible de C/C++ efficace tableau de bits
Double Possible de C/C++ efficace tableau de bits
OriginalL'auteur King Vash | 2010-09-27
Vous devez vous connecter pour publier un commentaire.
Utilisation
std::bitset
(siN
est une constante), sinon utiliserstd::vector<bool>
comme d'autres l'ont mentionné (mais n'oubliez pas de lire cet excellent article par Herb Sutter)MODIFIER:
Herb Sutter (dans cet article) mentionne que
EDIT 2:
Et si vous avez utilisé le coup de pouce que vous pouvez utiliser
boost::dynamic_bitset
(siN
est connu au moment de l'exécution)OriginalL'auteur Prasoon Saurav
Pour le meilleur ou pour le pire,
std::vector<bool>
utilisation de bits au lieu de bool, pour économiser de l'espace. Utilisez doncstd::vector
comme vous doit avoir été en premier lieu.Si
N
est une constante, vous pouvez utiliserstd::bitset
.OriginalL'auteur GManNickG
Un 'bool' type n'est pas stocké à l'aide de seulement 1 bit. À partir de votre commentaire à propos de la taille, il semble qu'il utilise 1 octet entier pour chaque bool.
Un C comme façon de faire, ce serait:
et puis logique OU d'octets pour obtenir tous vos morceaux:
Dans cet exemple, 0x01 et 0x02 sont des nombres hexadécimaux qui représentent des octets.
OriginalL'auteur whooops
Vous pourriez chercher
std::bitset
etstd::vector<bool>
. Ce dernier est souvent recommandé contre, parce que, malgré lesvector
dans le nom, il n'a pas vraiment d'agir comme un vecteur de tout autre type d'objet, et, en fait, ne répond pas aux exigences d'un conteneur en général. Néanmoins, il peut être assez utile.Otoh, que, rien ne va (au moins de façon fiable) magasin 1 million de bool valeurs en moins de 1 million de bits. Il ne peut simplement pas être fait avec certitude. Si vos ensembles de bits contiennent un certain degré de redondance, il existe différents schémas de compression qui peut être efficace (par exemple, LZ*, Huffman, arithmétique), mais sans en connaître le contenu, il est impossible de dire qu'ils seraient pour certains. L'une de ces solutions, cependant, normalement stocker chaque bool/bits dans un seul bit de stockage (plus un peu généraux de la comptabilité, mais c'est généralement une constante, et sur l'ordre des octets des dizaines d'octets au plus).
OriginalL'auteur Jerry Coffin
Oui, vous pouvez utiliser un bitset.
OriginalL'auteur Niki Yoshiuchi
Vous pourriez être intéressé à essayer de le BITSCAN bibliothèque comme une alternative. Récemment, une extension a été proposée pour le caractère, je ne suis pas sûr, c'est votre cas, mais il pourrait être.
OriginalL'auteur chesslover
Essayer std::bitset
OriginalL'auteur Dima
Vous pouvez utiliser un tableau d'octets et de l'index. L'indice de
n
serait en octets de l'indice den/8
, bit #n%8
. (Dans le cas std::bitset n'est pas disponible pour une raison quelconque).OriginalL'auteur driis
Si N est connu au moment de la compilation, l'utilisation std::bitset, sinon utilisez boost::dynamic_bitset.
OriginalL'auteur Eugen Constantin Dinca
Un 'bool' type n'est pas stocké à l'aide de seulement 1 bit. À partir de votre commentaire à propos de la taille, il semble qu'il utilise 1 octet entier pour chaque bool.
Un C comme façon de faire, ce serait:
élément du tableau est:
ou
set 1 dans la gamme:
OriginalL'auteur Vladimir