使用模运算符保持容器的索引

Pet*_*eUK 10 c++ math modulo

假设我有一个向量v,其中包含m个元素,以及一个名为i的向量的随机访问索引.

当我增加索引时,如果它超出范围,我想索引第一个(第零个)元素.类似地,当我递减索引时,如果索引<0,我想索引到最后一个元素.目前我只是在容器中移动一个元素,所以想出了这个函数:

unsigned int GetIndexModM(int index,unsigned int m) {return (index + m) % m;}
Run Code Online (Sandbox Code Playgroud)

呼叫站点可能如下所示:

std::vector<Whatever> v = ... // initialise with 5 elements
unsigned int i = 0;
unsigned int j = GetIndexModM(static_cast<int>(i) - 1,v.size()); // get preceeding index
Run Code Online (Sandbox Code Playgroud)

如果从索引中减去> m的值,则此函数将失败:

unsigned int j = GetIndexModM(static_cast<int>(i) - 17,v.size()); // oops: returns -2
Run Code Online (Sandbox Code Playgroud)

我的问题:什么是一个函数最优雅的实现,它接受任何整数并将其作为索引返回?

dcp*_*dcp 13

处理MOD的技巧是这个,它适用于正数和负数:

  val = ((val % mod_val) + mod_val) % mod_val; 
Run Code Online (Sandbox Code Playgroud)

例如,假设我们希望将值保持在0到359之间(包括0和359).我们可以用这个:

  val = ((val % 360) + 360) % 360; 
Run Code Online (Sandbox Code Playgroud)

这是C++中的一个简单示例.

int getmod(int val, int mod) {
  return ((val % mod) + mod) % mod; 
}

int main() {
  printf("%d\n", getmod(50,360));   // prints 50
  printf("%d\n", getmod(-400,360)); // prints 320
  printf("%d\n", getmod(350,360));  // prints 350
  printf("%d\n", getmod(375,360));  // prints 15
  printf("%d\n", getmod(-725,360));  // prints 355


  return 0;
}
Run Code Online (Sandbox Code Playgroud)