1

「循環」インデックスを実際のインデックスに変換するための(C ++での)最も簡潔で効率的な関数は何ですか?

私の問題は次の画像で説明できます: ここに画像の説明を入力してください

size要素を含むサイズの実際のリスト(たとえば、C ++ベクトル)があります(ここA, B, C, D, E)。-inf「循環」リストを模倣するために、入力インデックス(から+inf)をリストの実際のインデックスに変換する関数を探しています。この関数と画像の例を使用すると、コードは次のようになります。

for(i=-10; i < 10; ++i) std::cout<<list[myFunction(i, list.size())]<<" ";

画像に表示されているリストの4倍を印刷します。

私の現在の表現myFunctionは:

inline int myFunction(const int i, const int size)
{
    return (i >= 0) ? (i%size) : ((size-((-i)%size))%size);
}

これを書くためのより単純/簡潔/効率的な方法があると思いますか?

4

3 に答える 3

3

これを表現するためのより簡潔な方法がいくつかあります。i < 0どちらも、(i % size) + sizeがあなたが探している数であるという事実を含んでいます。だから、あなたは使うことができます

inline int myFunction(const int i, const int size)
{
    int index = i % size;
    return (index<0) ? (index+size) : index;
}

また

inline int myFunction(const int i, const int size)
{
    return (((i%size)+size)%size);
}
于 2012-08-25T21:16:01.977 に答える
1
size_t myFunction (const int i, const size_t size)   
{
  return (i - (i<1)) % size;
}

簡潔ですが、bool / int変換を利用しているため、あまり明確ではありません。STL準拠の循環バッファーを使用したい(たとえば、ブースト実装http://www.boost.org/doc/libs/1_50_0/libs/circular_buffer/doc/circular_buffer.html

于 2012-08-25T21:23:51.803 に答える
0

をオーバーロードすることをお勧めし[] operatorます。数学については、@murgatroid99の答えを参照してください。

于 2012-08-25T22:03:27.657 に答える