Существует ли стандартный циклический целочисленный класс в C ++? - PullRequest
11 голосов
/ 28 сентября 2010

У меня есть проблема, которая довольно часто встречается в коде, который я пишу в данный момент, когда я хочу получить целое число, которое может существовать только в определенном диапазоне, где диапазон [начало, конец). В основном я хочу иметь возможность сделать что-то вроде следующего:

cyclic_int ci(4, 8);

ci = 4;
assert(ci == 4);
ci += 3;
assert(ci == 7);
ci += 2;
assert(ci == 5);
assert(ci == 13);

И все это должно вернуть истину. По сути, класс автоматически применяет для меня модуль (%), а целое число действует как циклическое целое число в диапазоне, с которым я его инициализирую. Я мог бы реализовать этот класс сам и перегрузить все обычные операторы, чтобы он хорошо работал с обычными целыми числами, но он кажется полезным классом, который кто-то мог создать раньше.

Итак, мой вопрос в том, существует ли где-то такой общий класс, которым пользуются все, или я думаю сделать это неправильно, и есть ли более простой способ. (Моя цель - не думать постоянно о применении к нему оператора% или любой другой подобной функции) Спасибо.

Редактировать: Я решил написать свой собственный просто для удовольствия: http://github.com/robertmassaioli/wrapping_number

Ответы [ 3 ]

4 голосов
/ 28 сентября 2010

Не проще ли воспользоваться функцией 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); 
2 голосов
/ 29 сентября 2010

Я никогда не использовал его, и он еще не является официальной библиотекой Boost, но Boost.ConstrainedValue имеет wrapping_int, который очень похож на то, что вы ищете.Хотя он еще не является частью Boost, он был недавно рассмотрен и, IIUC, условно принят: http://lists.boost.org/boost-announce/2010/09/0265.php

Библиотека доступна по адресу http://rk.dl.pl/f/constrained_value.zip

в http://rk.dl.pl/r/constrained_value

1 голос
/ 28 сентября 2010

Это может быть не совсем то, что вам нужно, но вас может заинтересовать одна из множества библиотек Галуа-Поля (http://www.google.co.uk/search?q=galois+field+c%2B%2B+library). Я никогда не использовал ни одну из них, поэтому не могу дать конкретная рекомендация.

...