循环列表最简洁/最有效的表达式?

时间:2012-08-25 21:05:08

标签: c++ algorithm list modulo

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

我的问题可以通过以下图片来说明: enter image description here

我有一个包含元素(此处为size)的大小为A, B, C, D, E的真实列表(例如C ++向量)。为了模仿“循环”列表,我正在搜索将输入索引(从-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);
}

你认为有一种更简单/简洁/有效的方式来写这个吗?

3 个答案:

答案 0 :(得分: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;
}

OR

inline int myFunction(const int i, const int size)
{
    return (((i%size)+size)%size);
}

答案 1 :(得分: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

答案 2 :(得分:0)

我建议重载[] operator。至于数学,请参阅@ murgatroid99的答案。