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;
}