Что касается того, что вы сейчас спрашиваете;Я не верю, что еще ничего не существует.Теперь, что касается перебора контейнера по некоторому целому числу N
, мы можем сделать следующее;мы можем написать наш собственный тип функции for_each
.Я написал один ниже, и он работает как драгоценный камень!Вы также можете захотеть взглянуть на функцию std::advance
, так как она может быть другой возможной реализацией.Я проверял это сам, когда писал эту функцию.Тем не мение;Что касается массивов c, я не уверен, что многое можно обойтись без кучки дополнительного кода, такого как шаблоны классов, оболочки и т. д. Вот моя функция.
#include <array>
#include <vector>
#include <iterator>
template<typename Container, typename Function>
void for_each_by_n( Container&& cont, Function f, unsigned increment_by = 1) {
if ( increment_by == 0 ) return; // must check this for no op
using std::begin;
auto it = begin(cont);
using std::end;
auto end_it = end(cont);
while( it != end_it ) {
f(*it);
for ( unsigned n = 0; n < increment_by; ++n ) {
if ( it == end_it ) return;
++it;
}
}
}
int main() {
std::array<int,8> arr{ 0,1,2,3,4,5,6,7 };
std::vector<double> vec{ 1.2, 1.5, 1.9, 2.5, 3.3, 3.7, 4.2, 4.8 };
auto l = [](auto& v) { std::cout << v << ' '; };
for_each_by_n(arr, l); std::cout << '\n';
for_each_by_n(vec, l); std::cout << '\n';
for_each_by_n(arr, l, 2); std::cout << '\n';
for_each_by_n(arr, l, 4); std::cout << '\n';
for_each_by_n(vec, l, 3); std::cout << '\n';
for_each_by_n(vec, l, 5); std::cout << '\n';
for_each_by_n(arr, l, 8); std::cout << '\n';
for_each_by_n(vec, l, 8); std::cout << '\n';
// sanity check to see if it doesn't go past end.
for_each_by_n(arr, l, 9); std::cout << '\n';
for_each_by_n(vec, l, 9); std::cout << '\n';
return 0;
}
-Output-
0 1 2 3 4 5 6 7
1.2 1.5 1.9 2.5 3.3 3.7 4.2 4.8
0 2 4 6
0 4
1.2 2.5 4.2
1.2 3.7
0
1.2
0
1.2
Что мне нравится в этом примере выше, так это то, что вы можете не только увеличивать цикл на целое число N
;вышеупомянутая функция также принимает function pointer
, function object
, functor
или lambda
и выполняет требуемое действие.
В вашем случае вы пытались перебрать свой контейнер на 2 для каждого нечетного или каждого четного индекса, а внутри цикла вы печатали результаты.Вот в моем примере;Я печатаю результаты в виде лямбды, которая передается этой функции.
Однако единственное предостережение в этой конкретной реализации состоит в том, что он всегда будет начинаться с индекса 0. Вы можете легко расширить это, введя другой параметр integer
относительно смещения, где начнется итерация;но я оставлю это на ваше усмотрение.
В настоящее время мы должны согласиться с тем, что могут предложить C ++ 11 - C ++ 17.В ближайшем будущем у нас должно быть много новых и мощных функций с выпуском C ++ 20.