Comme nous le savons tous (espérons-le), vector<bool>
est totalement cassé et ne peut pas être traité comme un tableau C. Quelle est la meilleure façon d'obtenir cette fonctionnalité ? Jusqu'à présent, les idées auxquelles j'ai pensé sont les suivantes :
- Utilisez un
vector<char>
à la place, ou - Utilisez une classe enveloppante et faites en sorte que
vector<bool_wrapper>
Comment gérez-vous ce problème ? J'ai besoin de la c_array()
fonctionnalité.
En guise de question secondaire, si je n'ai pas besoin des c_array()
méthode, quelle est la meilleure façon d'aborder ce problème si j'ai besoin d'un accès aléatoire ? Devrais-je utiliser un deque ou autre chose ?
Edit :
- J'ai besoin d'un dimensionnement dynamique.
- Pour ceux qui ne le savent pas,
vector<bool>
est spécialisé de sorte que chaquebool
prend 1 bit. Vous ne pouvez donc pas le convertir en un tableau de style C. - Je suppose que le terme "wrapper" est un peu mal choisi. Je pensais à quelque chose comme ça :
Bien sûr, alors je dois lire dans une my_bool
en raison d'éventuels problèmes d'alignement :(
struct my_bool
{
bool the_bool;
};
vector<my_bool> haha_i_tricked_you;
2 votes
Y a-t-il une raison de ne pas utiliser... un tableau de style C ?
0 votes
Rlbond, avez-vous besoin d'une taille dynamique ?
17 votes
Ok je vais mordre - pourquoi pensez-vous que le vecteur est ""totalement cassé"" ?
0 votes
Bon sang. où ai-je lu que std::vector est spécialisé pour <bool, std::allocator<bool>> oO vector<bool, my_allocator> ne fonctionnera pas non plus :(
8 votes
@Andrew Grant - voir open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html
1 votes
Rlbond, vous pouvez transformer mon_bool* en bool* et obtenir un pointeur sur le membre the_bool. c'est ce qui est bien avec ces vieux types, l'alignement est toujours synchronisé avec le premier membre.
0 votes
Mais je vois ce que tu veux dire. on ne peut pas le traiter comme un tableau de bools alors :(
0 votes
@rlbond, essayez-vous d'interagir avec un tableau C de C99 _Bool ?
1 votes
@ribond, il serait utile de savoir pourquoi vous voulez un vecteur. Avez-vous l'intention de trier ces valeurs ? Voulez-vous faire du push and pop ?
7 votes
C'est intéressant,
vector<bool>
a juste causé un bug de course de données dans mon code, puisque je m'attendais à ce que différents threads puissent modifier différents éléments du vecteur en même temps en toute sécurité. Résolu en utilisantdeque<bool>
.