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

4

3 回答 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); 
于 2010-09-28T10:25:48.770 回答
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

于 2010-09-29T01:01:29.260 回答
1

这些可能不是您想要的,但您可能对许多 Galois-field 库之一感兴趣 ( http://www.google.co.uk/search?q=galois+field+c%2B% 2B+图书馆)。我从来没有使用过任何一个,所以我不能给出具体的建议。

于 2010-09-28T10:46:51.177 回答