minmax_element.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 552 行 · 第 1/2 页
HPP
552 行
template <typename ForwardIter> ForwardIter last_min_element(ForwardIter first, ForwardIter last) { return detail::basic_last_min_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> ForwardIter last_min_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_last_min_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); } template <typename ForwardIter> ForwardIter first_max_element(ForwardIter first, ForwardIter last) { return detail::basic_first_max_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> ForwardIter first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_first_max_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); } template <typename ForwardIter> ForwardIter last_max_element(ForwardIter first, ForwardIter last) { return detail::basic_last_max_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> ForwardIter last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_last_max_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); } // Minmax_element variants -- comments removed namespace detail { template <typename ForwardIter, class BinaryPredicate> std::pair<ForwardIter,ForwardIter> basic_first_min_last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { if (first == last) return std::make_pair(last,last); ForwardIter min_result = first; ForwardIter max_result = first; ForwardIter second = ++first; if (second == last) return std::make_pair(min_result, max_result); if (comp(second, min_result)) min_result = second; else max_result = second; first = ++second; if (first != last) ++second; while (second != last) { if (!comp(second, first)) { if (comp(first, min_result)) min_result = first; if (!comp(second, max_result)) max_result = second; } else { if (comp(second, min_result)) min_result = second; if (!comp(first, max_result)) max_result = first; } first = ++second; if (first != last) ++second; } if (first != last) { if (comp(first, min_result)) min_result = first; else if (!comp(first, max_result)) max_result = first; } return std::make_pair(min_result, max_result); } template <typename ForwardIter, class BinaryPredicate> std::pair<ForwardIter,ForwardIter> basic_last_min_first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { if (first == last) return std::make_pair(last,last); ForwardIter min_result = first; ForwardIter max_result = first; ForwardIter second = ++first; if (second == last) return std::make_pair(min_result, max_result); if (comp(max_result, second)) max_result = second; else min_result = second; first = ++second; if (first != last) ++second; while (second != last) { if (comp(first, second)) { if (!comp(min_result, first)) min_result = first; if (comp(max_result, second)) max_result = second; } else { if (!comp(min_result, second)) min_result = second; if (comp(max_result, first)) max_result = first; } first = ++second; if (first != last) ++second; } if (first != last) { if (!comp(min_result, first)) min_result = first; else if (comp(max_result, first)) max_result = first; } return std::make_pair(min_result, max_result); } template <typename ForwardIter, class BinaryPredicate> std::pair<ForwardIter,ForwardIter> basic_last_min_last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { if (first == last) return std::make_pair(last,last); ForwardIter min_result = first; ForwardIter max_result = first; ForwardIter second = first; ++second; if (second == last) return std::make_pair(min_result,max_result); ForwardIter potential_max_result = last; if (comp(first, second)) max_result = second; else { min_result = second; potential_max_result = second; } first = ++second; if (first != last) ++second; while (second != last) { if (comp(first, second)) { if (!comp(min_result, first)) min_result = first; if (!comp(second, max_result)) { max_result = second; potential_max_result = last; } } else { if (!comp(min_result, second)) min_result = second; if (!comp(first, max_result)) { max_result = first; potential_max_result = second; } } first = ++second; if (first != last) ++second; } if (first != last) { if (!comp(min_result, first)) min_result = first; if (!comp(first, max_result)) { max_result = first; potential_max_result = last; } } if (potential_max_result != last && !comp(potential_max_result, max_result)) max_result = potential_max_result; return std::make_pair(min_result,max_result); } } // namespace detail template <typename ForwardIter> inline std::pair<ForwardIter,ForwardIter> first_min_first_max_element(ForwardIter first, ForwardIter last) { return minmax_element(first, last); } template <typename ForwardIter, class BinaryPredicate> inline std::pair<ForwardIter,ForwardIter> first_min_first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return minmax_element(first, last, comp); } template <typename ForwardIter> std::pair<ForwardIter,ForwardIter> first_min_last_max_element(ForwardIter first, ForwardIter last) { return detail::basic_first_min_last_max_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> inline std::pair<ForwardIter,ForwardIter> first_min_last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_first_min_last_max_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); } template <typename ForwardIter> std::pair<ForwardIter,ForwardIter> last_min_first_max_element(ForwardIter first, ForwardIter last) { return detail::basic_last_min_first_max_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> inline std::pair<ForwardIter,ForwardIter> last_min_first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_last_min_first_max_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); } template <typename ForwardIter> std::pair<ForwardIter,ForwardIter> last_min_last_max_element(ForwardIter first, ForwardIter last) { return detail::basic_last_min_last_max_element(first, last, detail::less_over_iter<ForwardIter>() ); } template <typename ForwardIter, class BinaryPredicate> inline std::pair<ForwardIter,ForwardIter> last_min_last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) { return detail::basic_last_min_last_max_element(first, last, detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); }} // namespace boost#endif // BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?