You may use something like (c++03):
template<class InputIt, class T>
std::pair<InputIt, T>
accumulate_until(InputIt begin, InputIt end, T value, T thresold_value)
{
for (InputIt it = begin; it != end; ++it) {
value += *it;
if (thresold_value < value) {
return std::make_pair(it, value);
}
}
return std::make_pair(end, value);
}
Or a more generic solution (c++03):
namespace detail
{
template <typename T, typename Pred>
class InternalPredicate
{
public:
InternalPredicate(T& value, Pred& pred) : value(value), pred(pred) {}
bool operator () (const T& t) {
value += t;
return pred(value);
}
private:
T& value;
Pred& pred;
};
}
template<class InputIt, class T, class Pred>
std::pair<InputIt, T>
accumulate_until(InputIt begin, InputIt end, T value, Pred pred)
{
InputIt it = std::find_if(begin, end, detail::InternalPredicate<T, Pred>(value, pred));
return std::make_pair(it, value);
}
or in C++11:
template<class InputIt, class T, class Pred>
std::pair<InputIt, value>
accumulate_until(InputIt begin, InputIt end, T value, Pred pred)
{
auto internal_pred = [&value, &pred] (const T& t) {
value += t;
return pred(value);
};
InputIt it = std::find_if(begin, end, internal_pred);
return std::make_pair(it, value);
}