2012-08-25 5 views
1

Quelle est la fonction la plus concise/efficace (en C++) pour convertir un index "cyclique" dans un index réel?Expression la plus concise/efficace pour une liste cyclique?

Mon problème peut être illustré par l'image suivante: enter image description here

J'ai une vraie liste (un vecteur par exemple C++) de taille size contenant des éléments (ici A, B, C, D, E). Afin d'imiter une liste "cyclique" je cherche une fonction pour convertir un index d'entrée (de -inf à +inf) en index réel de la liste. Avec cette fonction et l'exemple d'image le code:

for(i=-10; i < 10; ++i) std::cout<<list[myFunction(i, list.size())]<<" "; 

imprimera 4 fois la liste comme indiqué dans l'image.

Mon expression actuelle de myFunction est:

inline int myFunction(const int i, const int size) 
{ 
    return (i >= 0) ? (i%size) : ((size-((-i)%size))%size); 
} 

Pensez-vous qu'il ya une façon plus simple,/concise/efficace d'écrire cela?

Répondre

3

Il existe deux façons plus concises de représenter cela. Les deux impliquent le fait que si i < 0, (i % size) + size est le nombre que vous recherchez. Ainsi, vous pouvez utiliser

inline int myFunction(const int i, const int size) 
{ 
    int index = i % size; 
    return (index<0) ? (index+size) : index; 
} 

OU

inline int myFunction(const int i, const int size) 
{ 
    return (((i%size)+size)%size); 
} 
+0

Pourquoi vérifiez-vous si l'index <0? la taille va être 5 dans ce cas, et le tableau va de 0 à 4. La taille de i% vous donnera un nombre de 0 à la taille - 1. return i% size, est assez bon. – JustinDanielson

+0

Parce que prendre le module d'un nombre négatif peut renvoyer un nombre négatif (ainsi '-8% 5' peut renvoyer' -3') – murgatroid99

1
size_t myFunction (const int i, const size_t size) 
{ 
    return (i - (i<1)) % size; 
} 

Concise, mais pas très claire car elle exploite les conversions booléens/int. Je préférerais un tampon circulaire compatible STL (comme par exemple l'implémentation boost http://www.boost.org/doc/libs/1_50_0/libs/circular_buffer/doc/circular_buffer.html)

+0

Notez que le signe du résultat de l'opérateur '%' est défini par l'implémentation si l'un ou l'autre opérande est négatif dans la norme de 1998. – aib

0

Je suggérerais de surcharger le [] operator. En ce qui concerne les maths, voir la réponse de @ murgatroid99.

Questions connexes