C++ 循环列表的最简洁/高效表达式?

C++ 循环列表的最简洁/高效表达式?,c++,algorithm,list,modulo,C++,Algorithm,List,Modulo,在C++中,将“循环”索引转换为实索引的最简洁/高效的函数是什么 下图可以说明我的问题: 我有一个实际的列表(例如C++向量),它包含元素(这里是代码> A、B、C、D、E < /代码>)。为了模拟“循环”列表,我正在搜索一个函数,将输入索引(从-inf转换为+inf)转换为列表的实际索引。使用此函数和图像示例,代码如下: for(i=-10; i < 10; ++i) std::cout<<list[myFunction(i, list.size())]<<"

在C++中,将“循环”索引转换为实索引的最简洁/高效的函数是什么

下图可以说明我的问题:

我有一个实际的列表(例如C++向量),它包含元素(这里是代码> A、B、C、D、E < /代码>)。为了模拟“循环”列表,我正在搜索一个函数,将输入索引(从

-inf
转换为
+inf
)转换为列表的实际索引。使用此函数和图像示例,代码如下:

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

你认为有更简单/简洁/高效的方法来写这个吗?

有两种更简洁的方法来表示这个。两者都涉及一个事实,即如果
i<0
(i%size)+size
就是您要查找的数字。所以,你可以使用

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

有两种更简洁的方式来表示这一点。两者都涉及一个事实,即如果
i<0
(i%size)+size
就是您要查找的数字。所以,你可以使用

inline int myFunction(const int i, const int size)
{
    int index = i % size;
    return (index<0) ? (index+size) : index;
}
size\u t myFunction(常量int i,常量size\u t size)
{
返回(i-(i
size\u t myFunction)(常量int i,常量size\u t size)
{

return(i-(i我建议重载
[]操作符
。至于数学,请参阅@murgatroid99的答案。

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

请注意,如果'98标准中的任一操作数为负,则
%
运算符的结果符号是实现定义的。请注意,如果'98标准中的任一操作数为负,则
%
运算符的结果符号是实现定义的。为什么您正在检查索引是否<0?在这种情况下,大小将为5,数组从0变为4。i%size将为您提供一个从0到大小-1的数字。返回i%size就足够了。因为取负数的模可以返回负数(因此
-8%5
可以返回
-3
)为什么要检查索引是否<0?在这种情况下,大小将是5,数组从0变为4。i%size将给您一个从0到大小-1的数字。返回i%size就足够了。因为取负数的模可以返回负数(因此
-8%5
可以返回
-3
inline int myFunction(const int i, const int size)
{
    return (((i%size)+size)%size);
}
size_t myFunction (const int i, const size_t size)   
{
  return (i - (i<1)) % size;
}