Использование оператора модуля для сохранения в пределах индексов контейнера

Предположим, у меня есть вектор 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

Мой вопрос: какая самая элегантная реализация функции, которая принимает любое целое число и возвращает его место в виде индекса?

10
задан dcp 20 July 2011 в 16:37
поделиться