Y at-il une classe standard Cyclique entier en C ++?
-
26-09-2019 - |
Question
J'ai un problème qui est assez fréquent dans le code que je vous écris au moment où je veux avoir un entier qui ne peut exister à l'intérieur d'une certaine plage où la plage est début [, fin). Fondamentalement, je veux être en mesure de faire quelque chose comme ce qui suit:
cyclic_int ci(4, 8);
ci = 4;
assert(ci == 4);
ci += 3;
assert(ci == 7);
ci += 2;
assert(ci == 5);
assert(ci == 13);
Et cela devrait tout retourner vrai. Fondamentalement, le module applique automatiquement classe (%) pour me et le nombre entier agit comme un nombre entier dans l'intervalle cyclique que j'init avec. Je pourrais mettre en œuvre cette classe moi-même et surcharger l'ensemble des opérateurs communs pour le faire fonctionner bien avec des entiers normaux mais il semble comme une classe utile que quelqu'un a peut-être fait avant.
Alors, ma question est, est-il une classe commune comme ça là-bas quelque part que tout le monde utilise ou ce que je pense de ce fait dans le mauvais sens et est-il un moyen plus simple. (Mon but est de ne pas avoir à penser constamment à l'application de l'opérateur% ou une fonction similaire au-dessus) Merci.
Edit: j'ai décidé d'écrire mon propre un aussi juste pour le plaisir: http://github.com/robertmassaioli / wrapping_number
La solution
Je ne ai jamais utilisé et il est pas encore une bibliothèque officielle de Boost, mais Boost.ConstrainedValue a une wrapping_int
qui ressemble beaucoup à ce que vous cherchez.
Bien qu'il ne soit pas encore partie de Boost, il a été examiné et, IIUC, récemment accepté sous condition: http://lists.boost.org/boost-announce/2010/09/0265.php
La bibliothèque est disponible à http://rk.dl.pl/f/constrained_value.zip
La documentation est à http://rk.dl.pl/r/constrained_value
Autres conseils
est-il pas plus facile d'utiliser la fonction normalize
?
int normalize(int val, int start, int end)
{
return (val - start) % (end - start) + start;
}
int ci = 4;
assert(ci == 4);
ci = normalize(ci + 3, 4, 8);
assert(ci == 7);
ci = normalize(ci + 2, 4, 8);
assert(ci == 5);
assert(ci == 13);
Ceux-ci ne peuvent être exactement ce que vous voulez, mais vous pouvez être intéressé par l'une des nombreuses bibliothèques de Galois là-bas ( http://www.google.co.uk/search?q=galois+field+c%2B%2B+library ) . Je ne l'ai jamais utilisé l'un d'entre eux, donc je ne peux pas donner une recommandation spécifique.