Предположим, у меня есть вектор v с m элементами в нем и индекс произвольного доступа к вектору с именем i.
Когда я увеличиваю индекс, если он выходит за пределы, я хочу проиндексировать первый (нулевой) элемент. Точно так же, когда я уменьшаю индекс, если индекс <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
Мой вопрос: какая самая элегантная реализация функции, которая принимает любое целое число и возвращает его место в виде индекса?