⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_algo.h

📁 STL完整源码,实现STL文件的读写和三维体的重建及其分析
💻 H
📖 第 1 页 / 共 5 页
字号:
template <class ForwardIterator, class Predicate>ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,                          Predicate pred) {  first = find_if(first, last, pred);  ForwardIterator next = first;  return first == last ? first : remove_copy_if(++next, last, first, pred);}template <class InputIterator, class ForwardIterator>ForwardIterator __unique_copy(InputIterator first, InputIterator last,                              ForwardIterator result, forward_iterator_tag) {  *result = *first;  while (++first != last)    if (*result != *first) *++result = *first;  return ++result;}template <class InputIterator, class OutputIterator, class T>OutputIterator __unique_copy(InputIterator first, InputIterator last,                             OutputIterator result, T*) {  T value = *first;  *result = value;  while (++first != last)    if (value != *first) {      value = *first;      *++result = value;    }  return ++result;}template <class InputIterator, class OutputIterator>inline OutputIterator __unique_copy(InputIterator first, InputIterator last,                                    OutputIterator result,                                     output_iterator_tag) {  return __unique_copy(first, last, result, value_type(first));}template <class InputIterator, class OutputIterator>inline OutputIterator unique_copy(InputIterator first, InputIterator last,                                  OutputIterator result) {  if (first == last) return result;  return __unique_copy(first, last, result, iterator_category(result));}template <class InputIterator, class ForwardIterator, class BinaryPredicate>ForwardIterator __unique_copy(InputIterator first, InputIterator last,                              ForwardIterator result,                               BinaryPredicate binary_pred,                              forward_iterator_tag) {  *result = *first;  while (++first != last)    if (!binary_pred(*result, *first)) *++result = *first;  return ++result;}template <class InputIterator, class OutputIterator, class BinaryPredicate,          class T>OutputIterator __unique_copy(InputIterator first, InputIterator last,                             OutputIterator result,                             BinaryPredicate binary_pred, T*) {  T value = *first;  *result = value;  while (++first != last)    if (!binary_pred(value, *first)) {      value = *first;      *++result = value;    }  return ++result;}template <class InputIterator, class OutputIterator, class BinaryPredicate>inline OutputIterator __unique_copy(InputIterator first, InputIterator last,                                    OutputIterator result,                                    BinaryPredicate binary_pred,                                    output_iterator_tag) {  return __unique_copy(first, last, result, binary_pred, value_type(first));}template <class InputIterator, class OutputIterator, class BinaryPredicate>inline OutputIterator unique_copy(InputIterator first, InputIterator last,                                  OutputIterator result,                                  BinaryPredicate binary_pred) {  if (first == last) return result;  return __unique_copy(first, last, result, binary_pred,                       iterator_category(result));}template <class ForwardIterator>ForwardIterator unique(ForwardIterator first, ForwardIterator last) {  first = adjacent_find(first, last);  return unique_copy(first, last, first);}template <class ForwardIterator, class BinaryPredicate>ForwardIterator unique(ForwardIterator first, ForwardIterator last,                       BinaryPredicate binary_pred) {  first = adjacent_find(first, last, binary_pred);  return unique_copy(first, last, first, binary_pred);}template <class BidirectionalIterator>void __reverse(BidirectionalIterator first, BidirectionalIterator last,                bidirectional_iterator_tag) {  while (true)    if (first == last || first == --last)      return;    else      iter_swap(first++, last);}template <class RandomAccessIterator>void __reverse(RandomAccessIterator first, RandomAccessIterator last,               random_access_iterator_tag) {  while (first < last) iter_swap(first++, --last);}template <class BidirectionalIterator>inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {  __reverse(first, last, iterator_category(first));}template <class BidirectionalIterator, class OutputIterator>OutputIterator reverse_copy(BidirectionalIterator first,                            BidirectionalIterator last,                            OutputIterator result) {  while (first != last) {    --last;    *result = *last;    ++result;  }  return result;}template <class ForwardIterator, class Distance>void __rotate(ForwardIterator first, ForwardIterator middle,              ForwardIterator last, Distance*, forward_iterator_tag) {  for (ForwardIterator i = middle; ;) {    iter_swap(first, i);    ++first;    ++i;    if (first == middle) {      if (i == last) return;      middle = i;    }    else if (i == last)      i = middle;  }}template <class BidirectionalIterator, class Distance>void __rotate(BidirectionalIterator first, BidirectionalIterator middle,              BidirectionalIterator last, Distance*,              bidirectional_iterator_tag) {  reverse(first, middle);  reverse(middle, last);  reverse(first, last);}template <class EuclideanRingElement>EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n){  while (n != 0) {    EuclideanRingElement t = m % n;    m = n;    n = t;  }  return m;}template <class RandomAccessIterator, class Distance, class T>void __rotate_cycle(RandomAccessIterator first, RandomAccessIterator last,                    RandomAccessIterator initial, Distance shift, T*) {  T value = *initial;  RandomAccessIterator ptr1 = initial;  RandomAccessIterator ptr2 = ptr1 + shift;  while (ptr2 != initial) {    *ptr1 = *ptr2;    ptr1 = ptr2;    if (last - ptr2 > shift)      ptr2 += shift;    else      ptr2 = first + (shift - (last - ptr2));  }  *ptr1 = value;}template <class RandomAccessIterator, class Distance>void __rotate(RandomAccessIterator first, RandomAccessIterator middle,              RandomAccessIterator last, Distance*,              random_access_iterator_tag) {  Distance n = __gcd(last - first, middle - first);  while (n--)    __rotate_cycle(first, last, first + n, middle - first,                   value_type(first));}template <class ForwardIterator>inline void rotate(ForwardIterator first, ForwardIterator middle,                   ForwardIterator last) {  if (first == middle || middle == last) return;  __rotate(first, middle, last, distance_type(first),           iterator_category(first));}template <class ForwardIterator, class OutputIterator>OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle,                           ForwardIterator last, OutputIterator result) {  return copy(first, middle, copy(middle, last, result));}template <class RandomAccessIterator, class Distance>void __random_shuffle(RandomAccessIterator first, RandomAccessIterator last,                      Distance*) {  if (first == last) return;  for (RandomAccessIterator i = first + 1; i != last; ++i) #ifdef __STL_NO_DRAND48    iter_swap(i, first + Distance(rand() % ((i - first) + 1)));#else  iter_swap(i, first + Distance(lrand48() % ((i - first) + 1)));#endif}template <class RandomAccessIterator>inline void random_shuffle(RandomAccessIterator first,                           RandomAccessIterator last) {  __random_shuffle(first, last, distance_type(first));}template <class RandomAccessIterator, class RandomNumberGenerator>void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,                    RandomNumberGenerator& rand) {  if (first == last) return;  for (RandomAccessIterator i = first + 1; i != last; ++i)    iter_swap(i, first + rand((i - first) + 1));}template <class ForwardIterator, class OutputIterator, class Distance>OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,                               OutputIterator out, const Distance n){  Distance remaining = 0;  distance(first, last, remaining);  Distance m = min(n, remaining);  while (m > 0) {#ifdef __STL_NO_DRAND48    if (rand() % remaining < m) {#else    if (lrand48() % remaining < m) {#endif      *out = *first;      ++out;      --m;    }    --remaining;    ++first;  }  return out;}template <class ForwardIterator, class OutputIterator, class Distance,          class RandomNumberGenerator>OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,                               OutputIterator out, const Distance n,                               RandomNumberGenerator& rand){  Distance remaining = 0;  distance(first, last, remaining);  Distance m = min(n, remaining);  while (m > 0) {    if (rand(remaining) < m) {      *out = *first;      ++out;      --m;    }    --remaining;    ++first;  }  return out;}template <class InputIterator, class RandomAccessIterator, class Distance>RandomAccessIterator __random_sample(InputIterator first, InputIterator last,                                     RandomAccessIterator out,                                     const Distance n){  Distance m = 0;  Distance t = n;  for ( ; first != last && m < n; ++m, ++first)     out[m] = *first;  while (first != last) {    ++t;#ifdef __STL_NO_DRAND48    Distance M = rand() % t;#else    Distance M = lrand48() % t;#endif    if (M < n)      out[M] = *first;    ++first;  }  return out + m;}template <class InputIterator, class RandomAccessIterator,          class RandomNumberGenerator, class Distance>RandomAccessIterator __random_sample(InputIterator first, InputIterator last,                                     RandomAccessIterator out,                                     RandomNumberGenerator& rand,                                     const Distance n){  Distance m = 0;  Distance t = n;  for ( ; first != last && m < n; ++m, ++first)    out[m] = *first;  while (first != last) {    ++t;    Distance M = rand(t);    if (M < n)      out[M] = *first;    ++first;  }  return out + m;}template <class InputIterator, class RandomAccessIterator>inline RandomAccessIteratorrandom_sample(InputIterator first, InputIterator last,              RandomAccessIterator out_first, RandomAccessIterator out_last) {  return __random_sample(first, last, out_first, out_last - out_first);}template <class InputIterator, class RandomAccessIterator,           class RandomNumberGenerator>inline RandomAccessIteratorrandom_sample(InputIterator first, InputIterator last,              RandomAccessIterator out_first, RandomAccessIterator out_last,              RandomNumberGenerator& rand) {  return __random_sample(first, last, out_first, rand, out_last - out_first);}template <class BidirectionalIterator, class Predicate>BidirectionalIterator partition(BidirectionalIterator first,                                BidirectionalIterator last, Predicate pred) {  while (true) {    while (true)      if (first == last)        return first;      else if (pred(*first))        ++first;      else        break;    --last;    while (true)      if (first == last)        return first;      else if (!pred(*last))        --last;      else        break;    iter_swap(first, last);    ++first;  }}template <class ForwardIterator, class Predicate, class Distance>ForwardIterator __inplace_stable_partition(ForwardIterator first,                                           ForwardIterator last,                                           Predicate pred, Distance len) {  if (len == 1) return pred(*first) ? last : first;  ForwardIterator middle = first;  advance(middle, len / 2);  ForwardIterator     first_cut = __inplace_stable_partition(first, middle, pred, len / 2);  ForwardIterator     second_cut = __inplace_stable_partition(middle, last, pred,                                            len - len / 2);  rotate(first_cut, middle, second_cut);  len = 0;  distance(middle, second_cut, len);  advance(first_cut, len);  return first_cut;}template <class ForwardIterator, class Pointer, class Predicate, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -