Über jedes n-teElement iterieren
-
Hallo zusammen,
ich habe folgenden Code:
std::vector<double> v = { 1, 2, 3, 4, 5 }; size_t n = 2; for (auto it = v.begin(); it != v.end(); it += n) { std::cout << *it << '\n'; }der mir allerdings um die Ohren fliegt, da ich über v.end() hinaus inkrementiere.
Wie kann man sowas am besten lösen? Also mir ist eingefallen dass man it in einer Schleife immer um 1 erhöhen könnte und nach jedem mal inkrementieren schauen, ob end erreicht wurde. Aber das ist ziemlich ineffizient nehme ich mal an? Gibt es noch bessere Möglichkeiten?
-
Du kannst auch die maximal mögliche Distanz direkt ermitteln.
std::vector<double> v = { 1, 2, 3, 4, 5 }; size_t n = 2; for (auto it = v.begin(), end = v.end(); it != end; it += std::min( n, end - it )) { std::cout << *it << '\n'; }Wenn es öfter gebraucht wird, sollte man evtl. darüber nachdenken, gleich einen entsprechenden stride-iterator-Adapter zu verwenden.
-
Mir fällt noch
auto it = v.begin(); auto iterations = (v.size() + n - 1) / n; while (iterations--) { // […] it += n; }ein.
-
Schau mal, ob http://www.cplusplus.com/reference/valarray/slice/slice/ besser passt.
-
std::vector<double> v = { 1, 2, 3, 4, 5 }; size_t n = 2; for (auto i : v | boost::adaptors::strided(n)) std::cout << i << '\n';
-
Edit:
#include <boost/range/adaptor/strided.hpp>
-
Vielen Dank für die Vorschläge, dacht ich mir doch dass es besser geht
