在真实索引中转换“循环”索引的最简洁/最有效的函数(在C ++中)是什么?
我的问题可以通过以下图片来说明:
我有一个包含元素(此处为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);
}
你认为有一种更简单/简洁/有效的方式来写这个吗?
答案 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的答案。