Алгоритм Skip_over()


Мне просто любопытно, если это понятно для обычного человека.

template<typename IteratorType>
inline IteratorType skip_over(
    IteratorType begin,
    IteratorType end,
    typename std::iterator_traits<IteratorType>::value_type skippedCharacter)
{
    typedef typename std::iterator_traits<IteratorType>::value_type value_type;
    return std::find_if(begin, end, 
            std::not1(
                 std::bind2nd(std::equal_to<value_type>(), skippedCharacter)
            )
        );
}


168
4
задан 3 августа 2011 в 01:08 Источник Поделиться
Комментарии
1 ответ

Несколько замечаний:


  • Алгоритмы обычно используют имена первого и последнего для итераторов, которые они принимают, не начала и конца (в общеупотребительном смысле этого слова, начала и конца конкретно для итераторов, которые разграничивают диапазон, в контейнере).

  • Использовать find_if кажется немного чрезмерной: да, это хорошо, чтобы использовать стандартную библиотеку алгоритмов, но если вы пишете свой собственный алгоритм, вы можете также просто написать цикл, особенно, если это делает код гораздо понятнее.

  • Что касается шаблона наименования параметров, это полезно, если вы говорите, что категория итератора требуется; это помогает документировать алгоритм.

Рассмотрим следующие альтернативные реализации:

template <typename ForwardIterator, typename T>
ForwardIterator skip_over(ForwardIterator first, ForwardIterator last, T const& x)
{
while (first != last && *first == x)
++first;

return first;
}

6
ответ дан 3 августа 2011 в 02:08 Источник Поделиться