C ++中是否有标准的循环整数类?

时间:2010-09-28 10:05:14

标签: c++ class integer encapsulation modulus

我有一个在我正在编写的代码中很常见的问题,我希望有一个整数只能存在于范围为[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

3 个答案:

答案 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

图书馆位于http://rk.dl.pl/f/constrained_value.zip

文档位于http://rk.dl.pl/r/constrained_value

答案 2 :(得分:1)

这些可能不是你想要的,但你可能对那里的许多Galois字段库中的一个感兴趣(http://www.google.co.uk/search?q=galois+field+c%2B%2B+library)。我从来没有使用过它们,所以我不能给出具体的推荐。

相关问题