Załóżmy, że mam wektor v z elementami m w nim i indeksem dostępu losowego do wektora o nazwie i.Używanie operatora modulus do utrzymywania indeksów kontenera
Kiedy zwiększam indeks, jeśli wykracza poza granice, chcę zindeksować pierwszy (zeroth) element. Podobnie, gdy zmniejszam indeks, jeśli indeks to < 0, chcę indeksować do ostatniego elementu. W tej chwili jestem w ruchu jedynie przez pojemnik jeden element na raz, więc wymyślił tej funkcji:
unsigned int GetIndexModM(int index,unsigned int m) {return (index + m) % m;}
Wezwanie-witryna może wyglądać następująco:
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
funkcja ta jednak jeśli ktoś nie odejmuje wartość> m z indeksem:
unsigned int j = GetIndexModM(static_cast<int>(i) - 17,v.size()); // oops: returns -2
moje pytanie: Co to jest najbardziej elegancki realizacja funkcję, która pobiera dowolną liczbę całkowitą i powraca to miejsce jako wskaźnik?
Na niektórych platformach może być szybsze uniknięcie drugiej operacji modulo, kosztem porównania: 'val = val% mod; return val <0? val + mod: val; ' –
Czy to działa, gdy' val <-mod_val', czy obsługuje tylko ujemne liczby całkowite z '-mod_val
@Andre Caron - Działa w tym scenariuszu, dodałem kolejny przykład (zobacz ostatni printf). – dcp