Существует ли стандартная реализация for_each
, которая вызывает элемент и следующий в диапазоне?
Например, возьмите диапазон {0, 1, 2, 3, 4, 5}
, я хотел бы вызвать функцию f
с каждым элементом и его преемником: {f(0, 1), f(1, 2), f(2, 3), f(3, 4), f(4, 5)}
Обратите внимание, что последний элемент пропущен, потому что он не имеет преемника.
Также было бы хорошо, если бы это было обобщено на n преемников, которые передаются вместе с самим элементом.
До сих пор я всегда решал эту проблему с помощью рукописного цикла с итераторами. Тем не менее, я хотел бы пойти намного дальше в соответствии с диапазоном С++ 11, основанным на или std::for_each
чтобы избежать кода на уровне котла.
Примеры
// today: handwritten loop
for(Range::iterator current = range.begin(); current != range.end(); ++current)
f(*current, *std::next(current));
// near future: wrapped version
for_each_pair(range.begin(), range.end(), f);
// slightly further future: generalized version
for_each_tuple<n>(range.begin(), range.end(), f);
Дополнительный вопрос
Название функции может быть улучшено. Для меня for_each_pair
/tuple
звучит так, как будто должны быть возвращены все подмножества размера n диапазона (что само по себе является другой проблемой, которую я хотел бы решить). Поэтому я хотел бы получить несколько предложений о лучших именах, таких как:
for_each_adjacent<n>
Временное решение
Я разместил свое собственное решение в ЧР. Я не буду дублировать его здесь, потому что речь идет о стандартном решении, и уже есть достаточно ответов.