Bonjour à tous,
Pour des raisons de lisibilité et de convivialité, j'aime à utiliser les fameux "range based for loop". Cependant, dans certains cas, je souhaiterais pouvoir agir sur le fonctionnement interne de cette boucle.
J'ai pu voir ça et là comment était interprété ce type de boucle (nécessité d'avoir un begin() et un end() comme pour une itération classique) mais je me demande si il existait un moyen de modifier le fonctionnement de ce type de boucle (comme on le fait pour un itérateur spécialisé).
par exemple, le code suivant :
me retourne sans surprise (compte tenu du fonctionnement interne de la boucle for) le résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 std::vector<int> mData{0, 1, 2, 3, 4, 5}; for(auto & v:mData) { if(v%2) { std::swap(v, mData[mData.size()-1]); mData.resize(mData.size()-1); } std::cout << v << ' '; }
or, on l'a compris, le résultat attendu est plutôt :0 5 2 4 4 2
La réponse peut facilement être obtenu grâce au code suivant :0 4 2
Qui nous donne bien le retour escompté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 auto it = mData.begin(); while(it != mData.end()) { if(*it%2) { std::swap(*it, mData[mData.size()-1]); mData.resize(mData.size()-1); } else { std::cout << *it << '\n'; ++it; } }
Mais ici, je perds complètement la convivialité du "range based for loop"... Dans un cas simpliste comme ce dernier, je m’accommode tout à fait de ce fonctionnement ; mais lorsque les containers sont plus "tricky" et nécessitent des iterator plus spécialisés, cela complexifie le code. Cette réflexion est aussi valable lorsque l'on se retrouve à avoir 15 boucles du même type mais légèrement différentes à écrire
La question finale est donc : Comment puis-je modifier le fonctionnement interne du "Range based for loop" afin que ce dernier fonctionne sur la base d'un iterateur spécifique ?
Merci d'avance !
Partager