Реализации 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
итератора и счетчик в точке, где предикат впервые выполняется. Это позволяет пользователям продолжать итерации.