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

11

我遇到了一个在我现在编写的代码中非常普遍的问题,即我想要一个整数,该整数只能存在于某个范围内 [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);
那应该全部返回 true。基本上,该类会自动为我应用模数(%),并且整数在范围内作为循环整数。我可以自己实现这个类,并重载所有常见运算符,以使其与普通整数良好地配合使用,但似乎有人可能已经制作了一个有用的类。

所以我的问题是,是否有一种常见的类似于此的类存在,每个人都在使用,或者我正在考虑错误的方式,并且还有更简单的方法。(我的目标是不必经常考虑对其应用 % 运算符或任何类似的函数)谢谢。

编辑:我也决定自己编写一个,只是出于乐趣:http://github.com/robertmassaioli/wrapping_number


1
据我所知,这种事情没有“行业标准”,比如Boost库,如果你是这个意思的话。但正如你所说,实现这样一个类并重载所有必要的运算符应该很容易。 - Charles Salvia
1
使用注释而不是答案,因为1)我从未使用过它,2)它还不是官方的Boost库,但是:Boost.ConstrainedValue具有“wrapping_int”,看起来非常类似于您要查找的内容:http://student.agh.edu.pl/~kawulak/constrained_value/constrained_value/tutorial.html#constrained_value.tutorial.other_error_policies_for_bounded_objects - Éric Malenfant
@Eric:这正是我正在寻找的,但它还没有成为boost库的一部分。我试着四处寻找,但没有找到参考实现。我会继续寻找,但你知道在哪里可以找到吗? - Robert Massaioli
请查看boost-announce邮件列表上的审核结果帖子,其中包含源代码链接:http://lists.boost.org/boost-announce/2010/09/0265.php - Éric Malenfant
1
@Eric 很棒,把那个评论变成答案,我会给你的。谢谢。 - Robert Massaioli
3个回答

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
那正是我想要避免的,因为我不想真正考虑应用规范化函数(因为我最终会忘记)。而且我认为最后一个断言也会失败? - Robert Massaioli
实际上,我认为最后一个assert应该会失败,因为13没有被定义为范围限制数字,我会使用assert(ci == cyclic_int <4,8> (13));(在这里使用模板很方便)。 - stefaanv
@stefaanv:我认为他的意思是,在cyclic_int(4, 8)中,13应该与5同余(即包括整数4、5、...12),这也是符合条件的。我同意使用模板的想法...可以提供更强的类型约束。 - andand

2

我也为了好玩写了自己的一个: http://github.com/robertmassaioli/wrapping_number - Robert Massaioli

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接