Вы можете выйти из for_each (), выбрасывая исключение из вашего функтора. Однако это часто не очень хорошая идея, и есть альтернативы.
Вы можете сохранить состояние в вашем функторе. Если вы обнаружите условие 'break', просто установите флаг в вашем функторе, а затем для каждой последующей итерации просто возвращайтесь, не выполняя действия вашего функтора. Очевидно, что это не остановит итерацию, которая может быть дорогой для больших коллекций, но по крайней мере остановит выполнение работы.
Если ваша коллекция отсортирована, вы можете найти () элемент, на который хотите разбить, а затем выполните for_each от begin () до возвращаемого элемента find ().
Наконец, вы можете реализовать for_each_if()
. Это снова не остановит итерацию, но не оценит ваш функтор, который выполняет работу, если предикат оценивается как ложный. Вот 2 варианта for_each_xxx()
, один из которых принимает значение и выполняет работу, если оператор == () имеет значение true, а другой - два функтора; один, который выполняет сравнение ala find_if (), и другой, который выполняет работу, если оператор сравнения оценивается как true.
/* ---
For each
25.1.1
template< class InputIterator, class Function, class T>
Function for_each_equal(InputIterator first, InputIterator last, const T& value, Function f)
template< class InputIterator, class Function, class Predicate >
Function for_each_if(InputIterator first, InputIterator last, Predicate pred, Function f)
Requires:
T is of type EqualityComparable (20.1.1)
Effects:
Applies f to each dereferenced iterator i in the range [first, last) where one of the following conditions hold:
1: *i == value
2: pred(*i) != false
Returns:
f
Complexity:
At most last - first applications of f
--- */
template< class InputIterator, class Function, class Predicate >
Function for_each_if(InputIterator first,
InputIterator last,
Predicate pred,
Function f)
{
for( ; first != last; ++first)
{
if( pred(*first) )
f(*first);
}
return f;
};
template< class InputIterator, class Function, class T>
Function for_each_equal(InputIterator first,
InputIterator last,
const T& value,
Function f)
{
for( ; first != last; ++first)
{
if( *first == value )
f(*first);
}
return f;
};