代码之家  ›  专栏  ›  技术社区  ›  Robert Massaioli

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

  •  11
  • Robert Massaioli  · 技术社区  · 15 年前

    我有一个问题,这在我正在编写的代码中是很常见的,我想要一个整数,它只能存在于某个范围内,这个范围是[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 回复  |  直到 15 年前
        1
  •  2
  •   Éric Malenfant    15 年前

    我从未使用过它,它还不是官方的Boost库,但是Boost.constrained值有一个 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
  •  4
  •   Alexey Malistov    15 年前

    使用这个函数不是更容易吗 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); 
    
        3
  •  1
  •   Oliver Charlesworth    15 年前

    这些可能不是您想要的,但是您可能对Galois字段库中的一个感兴趣( http://www.google.co.uk/search?q=galois+field+c%2B%2B+library