Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <typename InputIterator, typename Predicate>
- auto minmax_element(InputIterator first, InputIterator last, Predicate pred)
- -> std::pair<std::pair<decltype(*first), unsigned>, std::pair<decltype(*first), unsigned>>
- {
- auto min_elem = *first;
- auto max_elem = *first;
- unsigned min_n = 0;
- unsigned max_n = 0;
- for (auto it = first; it != last; ++it) {
- auto const& n = *it;
- if (n < min_elem) {
- min_elem = n;
- min_n = 1;
- } else if (!(min_elem < n)) {
- ++min_n;
- }
- if (max_elem < n) {
- max_elem = n;
- max_n = 1;
- } else if (!(n < max_elem)) {
- ++max_n;
- }
- }
- return std::make_pair(
- std::make_pair(min_elem, min_n), std::make_pair(max_elem, max_n));
- }
- template <typename InputIterator>
- auto minmax_element(InputIterator first, InputIterator last) {
- return ::minmax_element(first, last, std::less<decltype(*first)> {});
- }
- template <typename T>
- auto minmax_element(std::initializer_list<T> const& list) {
- return ::minmax_element(std::begin(list), std::end(list));
- }
- void main() {
- minmax_element({10}); // ((10, 1), (10, 1))
- minmax_element({10, 10}); // ((10, 2), (10, 2))
- minmax_element({10, 1}); // ((1, 1), (10, 1))
- minmax_element({1, 10}); // ((1, 1), (10, 1))
- minmax_element({10, 1, 10}); // ((1, 1), (10, 2))
- minmax_element({10, 10, 6, 7, 1, 1, 11}); // ((1, 2), (11, 1))
- minmax_element({10, 1, 1, 0, 10, 10, 11}); // ((0, 1), (11, 1))
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement