我有一个在我正在编写的代码中很常见的问题,我希望有一个整数只能存在于范围为[start,end]的特定范围内。基本上我希望能够做类似以下的事情:
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
答案 0 :(得分:4)
使用函数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);
答案 1 :(得分:2)
我从未使用过它,它还不是官方的Boost库,但是Boost.ConstrainedValue的wrapping_int
看起来与你正在寻找的非常相似。
虽然它尚未成为Boost的一部分,但它已经过审核,最近有条件地接受了IIUC:http://lists.boost.org/boost-announce/2010/09/0265.php
答案 2 :(得分:1)
这些可能不是你想要的,但你可能对那里的许多Galois字段库中的一个感兴趣(http://www.google.co.uk/search?q=galois+field+c%2B%2B+library)。我从来没有使用过它们,所以我不能给出具体的推荐。