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 + -
显示快捷键?