Выходной итератор, который только подсчитывает количество приращений? - PullRequest
5 голосов
/ 15 февраля 2011

В STL / Boost есть ли готовый выходной итератор, который только подсчитывает, сколько раз он увеличивается?Когда алгоритм делает *iter = value, значение просто отбрасывается.

Если нет, то сворачивание моего собственного кажется достаточно легким.Хотя это может быть полезно для других, если кто-то опубликовал пример такого итератора.

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

В стандарте C ++ такого итератора не существует, и, насколько мне известно, ни один итератор Boost не обладает такой точной функциональностью. Однако существует множество способов сделать это с помощью этих библиотек, не катая свои собственные. Например, используя Boost's function_output_iterator, вы можете построить счетчик, например так:

struct Counter {
    size_t* out;

    explicit Counter(size_t* where) : out(where) {
        // Handled in initializer list
    }

    /* Either make this a template, or make the class itself a template. */
    template <typename T> void operator()(T& value) {
        ++ *out;
    }
};

Этот тип функтора принимает указатель на переменную счетчика, а затем всякий раз, когда вызывается его operator(), увеличивается счетчик. Если вы затем оберните это в function_output_iterator, как показано здесь:

size_t count;
your_algorithm(begin, end,
              boost::make_function_output_iterator(Counter(&count)));

Затем, когда записывается созданный итератор, ваш operator() будет вызываться, а счетчик будет увеличиваться.

Надеюсь, это поможет!

0 голосов
/ 04 июня 2011

Да.В ускорении:

Итератор счета

...