1

在实际索引中转换“循环”索引的最简洁/有效的函数(在 C++ 中)是什么?

我的问题可以用下图说明: 在此处输入图像描述

我有一个包含元素大小的真实列表(例如 C++ 向量)size(此处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两者都涉及 if是(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 的循环缓冲区(例如 boost 实现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 回答