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

これらはあなたが望むものとは正確に一致しないかもしれませんが、そこにある多くのガロア体ライブラリの1つに興味があるかもしれません(http://www.google.co.uk/search?q=galois+field+c%2B% 2B +ライブラリ)。私はそれらを使ったことがないので、具体的な推奨はできません。

于 2010-09-28T10:46:51.177 に答える