Реализации count_until и аккумулировать_until?

Учитывая входную последовательность, стандартные алгоритмыstd::count а такжеstd::accumulate подсчитать количество вхождений определенного значения (или предикатов совпадений дляstd::count_if) и накопление заданной ассоциативной операции (сумма, произведение, логическое значение и / или, мин / макс, конкатенация строк и т. д.) соответственно.

Что делать, если кто-то хочет знать, содержит ли входная последовательность точно / как минимум / максимумn встречается / совпадает или накапливается до суммы точно / не менее / не болееn? Грубой силой было бы сравнить результатstd::count или жеstd::accumulate против целиn, но это упуститранний выход возможность, когда счет или накопление превышает цель уже в середине входной последовательности.

Можно, например, делатьcount_until как

template<class InputIt, class T, class Pred>
auto count_until(InputIt first, InputIt last, const T& value, Pred pred)
{
    auto res = 0;
    for (; first != last; ++first)
        if (*first == value && pred(++res))
            break; // early exit if predicate is satisfied
    return std::make_pair(first, res); // iterator and value to allow continuation    
}

и из которого можно проверить на равенство / по крайней мере / самое большее, используя подходящий предикат и сравнение с возвращенным счетчиком.

Вопросов:

можно ли написатьcount_until (и аналогично дляaccumulate_until) с использованием комбинации существующих стандартных алгоритмов, возможно, в сочетании с подходящимBoost.Iterator?В частности, я думал оfind_if заaccumulate_iterator где предикат извлекает счетчик или сумму из итератора.Или сделатьcount_until а такжеaccumulate_until гарантировать включение в качестве самостоятельных примитивов в будущую версию стандартной библиотеки?

редактировать: Я думаю, что самая полезная формулировка - вернутьstd::pair итератора и счетчик в точке, где предикат впервые выполняется. Это позволяет пользователям продолжать итерации.

Ответы на вопрос(0)

Ваш ответ на вопрос