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

Était-ce utile?

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.

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