【问题标题】:Is there a standard Cyclic Integer Class in C++?C++ 中有标准的循环整数类吗?
【发布时间】:2010-09-28 10:05:14
【问题描述】:

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

【问题讨论】:

  • 据我所知,这类东西没有“行业标准”——比如 Boost 库,如果你是这个意思的话。但正如您所说,实现这样一个类并重载所有必要的运算符应该很容易。
  • 使用评论而不是答案,因为 1)我从未使用过它 2)它还不是官方的 Boost 库,但是:Boost.ConstrainedValue 有一个“wrapping_int”,看起来与你的非常相似'正在寻找:student.agh.edu.pl/~kawulak/constrained_value/constrained_value/…
  • @Eric:这正是我一直在寻找的,但它还不是 boost 库的一部分。我试着环顾四周,找不到参考实现。我会继续寻找,但你知道一个在哪里吗?
  • 在 boost-announce 邮件列表上查看审核结果帖子,其中包含指向来源的链接:lists.boost.org/boost-announce/2010/09/0265.php
  • @Eric 真棒,把评论变成答案,我会给你。谢谢。

标签: c++ class integer encapsulation modulus


【解决方案1】:

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); 

【讨论】:

  • 这正是我试图避免的,因为我不想真正考虑应用 normalize 函数(因为我最终会忘记)。我认为最后一个断言也会失败?
  • 实际上,我认为最后一个断言应该失败,因为 13 没有被定义为范围有限的数字,我会使用 assert(ci == cyclic_int(13) ); (模板在这里很方便)
  • @stefaanv:我认为他的意思是 13 应该与 cyclic_int(4, 8) 中的 5 一致(即包括整数 4、5、... 12),它是.我同意模板的概念...提供更强的输入。
【解决方案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

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2012-06-04
    • 1970-01-01
    • 2015-05-27
    • 2020-06-30
    • 2011-05-28
    • 2019-12-07
    • 2016-05-03
    相关资源
    最近更新 更多