cpprejp 用

template<class InputIterator, class Predicate>
bool all_of(InputIterator first, InputIterator last, Predicate pred) {
    for ( ; first != last; ++first)
        if (!pred(*first)) return false;
    return true;
}
template<class InputIterator, class Predicate>
bool none_of(InputIterator first, InputIterator last, Predicate pred) {
    for ( ; first != last; ++first)
        if (pred(*first)) return false;
    return true;
}
template<class InputIterator, class Predicate>
bool any_of(InputIterator first, InputIterator last, Predicate pred) {
    for ( ; first != last; ++first)
        if (pred(*first)) return true;
    return false;
}
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f) {
    for ( ; first != last; ++first)
        f(*first);
    return f;
}
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
    for ( ; first != last; ++first)
        if (*first == value) return first;
    return last;
}
template<class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last, Predicate pred) {
    for ( ; first != last; ++first)
        if (pred(*first)) return first;
    return last;
}
template<class InputIterator, class Predicate>
InputIterator find_if_not(InputIterator first, InputIterator last, Predicate pred) {
    for ( ; first != last; ++first)
        if (!pred(*first)) return first;
    return last;
}
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2) {
    ForwardIterator1 result = last1;
    while ((first1 = std::search(first1, last1, first2, last2)) != last1) {
        result = first1;
        ++first1;
    }
    return result;
}

template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) {
    ForwardIterator1 result = last1;
    while ((first1 = std::search(first1, last1, first2, last2, pred)) != last1) {
        result = first1;
        ++first1;
    }
    return result;
}
template<class InputIterator, class ForwardIterator>
InputIterator find_first_of(InputIterator first1, InputIterator last1,
                            ForwardIterator first2, ForwardIterator last2) {
    for ( ; first1 != last1; ++first1)
        for (ForwardIterator2 it = first2; it != last2; ++it)
            if (*first == *it) return first1;
    return last1;
}
template<class InputIterator, class ForwardIterator, class BinaryPredicate>
InputIterator find_first_of(InputIterator first1, InputIterator last1,
                            ForwardIterator first2, ForwardIterator last2, BinaryPredicate pred) {
    for ( ; first1 != last1; ++first1)
        for (ForwardIterator2 it = first2; it != last2; ++it)
            if (pred(*first, *it)) return first1;
    return last1;
}
template<class ForwardIterator>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) {
    if (first == last) return last;

    ForwardIterator next = first;
    ++next;
    for ( ; next != last; ++next, ++first)
        if (*first == *next)
            return first;
    return last;
}
template<class ForwardIterator, BinaryPredicate pred>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred) {
    if (first == last) return last;

    ForwardIterator next = first;
    ++next;
    for ( ; next != last; ++next, ++first)
        if (pred(*first, *next))
            return first;
    return last;
}
template<class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
    count(InputIterator first, InputIterator last, const T& value) {
    typename iterator_traits<InputIterator>::difference_type ret = 0;
    for ( ; first != last; ++first) {
        if (value == *first) ret++;
    return ret;
}
template<class InputIterator, class Predicate>
typename iterator_traits<InputIterator>::difference_type
    count_if(InputIterator first, InputIterator last, Predicate pred) {
    typename iterator_traits<InputIterator>::difference_type ret = 0;
    for ( ; first != last; ++first) {
        if (pred(*first)) ret++;
    return ret;
}
template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2> mismatch(
    InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) {
    for ( ; first1 != last1; ++first1, ++first2)
        if (*first1 != *first2)
            return make_pair(first1, first2);
    return make_pair(first1, first2);
}
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2> mismatch(
    InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred) {
    for ( ; first1 != last1; ++first1, ++first2)
        if (!pred(*first, *first2))
            return make_pair(first1, first2);
    return make_pair(first1, first2);
}
template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2) {
    for ( ; first1 != last1; ++first1, ++first2)
        if (*first1 != *first2)
            return false;
    return true;
}
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate pred) {
    for ( ; first1 != last1; ++first1, ++first2)
        if (!pred(*first1, *first2))
            return false;
    return true;
}
return mismatch(first1, last1, first2).first == last1;
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2) {
    for ( ; first1 != last1; ++first1) {
        ForwardIterator1 p1 = first1;
        ForwardIterator2 p2 = first2;
        while (true) {
            if (p1 == last1) return last1;
            if (p2 == last2) return first1;
            if (*p1 != *p2) break;
            ++p1, ++p2;
        }
    }
    return first1;
}
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) {
    for ( ; first1 != last1; ++first1) {
        ForwardIterator1 p1 = first1;
        ForwardIterator2 p2 = first2;
        while (true) {
            if (p1 == last1) return last1;
            if (p2 == last2) return first1;
            if (!pred(*p1, *p2)) break;
            ++p1, ++p2;
        }
    }
    return first1;
}