gpt4 book ai didi

c++ - 使用模数运算符保持在容器的索引范围内

转载 作者:可可西里 更新时间:2023-11-01 15:55:58 26 4
gpt4 key购买 nike

假设我有一个包含 m 个元素的 vector v,以及一个名为 i 的 vector 的随机访问索引。

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

unsigned int GetIndexModM(int index,unsigned int m) {return (index + m) % m;}

调用站点可能如下所示:

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

但是,如果从索引中减去一个值 > m,此函数将失败:

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

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

最佳答案

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

  val = ((val % mod_val) + mod_val) % mod_val; 

例如,假设我们希望将值保持在 0 到 359(含)之间。我们可以使用这个:

  val = ((val % 360) + 360) % 360; 

这是一个简单的 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;
}

关于c++ - 使用模数运算符保持在容器的索引范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com