Supongamos que tengo un vector v con m elementos en él, y un índice de acceso aleatorio al vector llamado i.Usando el operador de módulo para mantener dentro de los índices del contenedor
Cuando incremento el índice, si sale de los límites, quiero indexar el primer elemento (cero). Del mismo modo, cuando decremento el índice, si el índice es < 0, quiero indexar al último elemento. Por el momento sólo me mueve a través del un elemento contenedor a la vez, por lo que se acercó con esta función:
unsigned int GetIndexModM(int index,unsigned int m) {return (index + m) % m;}
La llamada in situ podría tener este aspecto:
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
esta función fallará sin embargo, si se resta un valor> m de índice:
unsigned int j = GetIndexModM(static_cast<int>(i) - 17,v.size()); // oops: returns -2
Mi pregunta: ¿Cuál es el más elegante puesta en práctica de una función que toma un entero y devuelve su lugar como un índice?
En algunas plataformas, puede ser más rápido evitar la operación del segundo módulo, a costa de una comparación: 'val = val% mod; return val <0? val + mod: val; ' –
¿Funciona esto cuando' val <-mod_val', o solo maneja enteros negativos con '-mod_val
@Andre Caron - Funciona en ese escenario, agregué otro ejemplo (ver la última impresión). – dcp