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

📄 stl_algo.h

📁 STL完整源码,实现STL文件的读写和三维体的重建及其分析
💻 H
📖 第 1 页 / 共 5 页
字号:
          class Distance>ForwardIterator __stable_partition_adaptive(ForwardIterator first,                                            ForwardIterator last,                                            Predicate pred, Distance len,                                            Pointer buffer,                                            Distance buffer_size) {  if (len <= buffer_size) {    ForwardIterator result1 = first;    Pointer result2 = buffer;    for ( ; first != last ; ++first)      if (pred(*first)) {        *result1 = *first;        ++result1;      }      else {        *result2 = *first;        ++result2;      }    copy(buffer, result2, result1);    return result1;  }  else {    ForwardIterator middle = first;    advance(middle, len / 2);    ForwardIterator first_cut =      __stable_partition_adaptive(first, middle, pred, len / 2,                                  buffer, buffer_size);    ForwardIterator second_cut =      __stable_partition_adaptive(middle, last, pred, len - len / 2,                                  buffer, buffer_size);    rotate(first_cut, middle, second_cut);    len = 0;    distance(middle, second_cut, len);    advance(first_cut, len);    return first_cut;  }}template <class ForwardIterator, class Predicate, class T, class Distance>inline ForwardIterator __stable_partition_aux(ForwardIterator first,                                              ForwardIterator last,                                               Predicate pred, T*, Distance*) {  temporary_buffer<ForwardIterator, T> buf(first, last);  if (buf.size() > 0)    return __stable_partition_adaptive(first, last, pred,                                       Distance(buf.requested_size()),                                       buf.begin(), buf.size());  else    return __inplace_stable_partition(first, last, pred,                                       Distance(buf.requested_size()));}template <class ForwardIterator, class Predicate>inline ForwardIterator stable_partition(ForwardIterator first,                                        ForwardIterator last,                                         Predicate pred) {  if (first == last)    return first;  else    return __stable_partition_aux(first, last, pred,                                  value_type(first), distance_type(first));}template <class RandomAccessIterator, class T>RandomAccessIterator __unguarded_partition(RandomAccessIterator first,                                            RandomAccessIterator last,                                            T pivot) {  while (true) {    while (*first < pivot) ++first;    --last;    while (pivot < *last) --last;    if (!(first < last)) return first;    iter_swap(first, last);    ++first;  }}    template <class RandomAccessIterator, class T, class Compare>RandomAccessIterator __unguarded_partition(RandomAccessIterator first,                                            RandomAccessIterator last,                                            T pivot, Compare comp) {  while (1) {    while (comp(*first, pivot)) ++first;    --last;    while (comp(pivot, *last)) --last;    if (!(first < last)) return first;    iter_swap(first, last);    ++first;  }}const int __stl_threshold = 16;template <class RandomAccessIterator, class T>void __unguarded_linear_insert(RandomAccessIterator last, T value) {  RandomAccessIterator next = last;  --next;  while (value < *next) {    *last = *next;    last = next;    --next;  }  *last = value;}template <class RandomAccessIterator, class T, class Compare>void __unguarded_linear_insert(RandomAccessIterator last, T value,                                Compare comp) {  RandomAccessIterator next = last;  --next;    while (comp(value , *next)) {    *last = *next;    last = next;    --next;  }  *last = value;}template <class RandomAccessIterator, class T>inline void __linear_insert(RandomAccessIterator first,                             RandomAccessIterator last, T*) {  T value = *last;  if (value < *first) {    copy_backward(first, last, last + 1);    *first = value;  }  else    __unguarded_linear_insert(last, value);}template <class RandomAccessIterator, class T, class Compare>inline void __linear_insert(RandomAccessIterator first,                             RandomAccessIterator last, T*, Compare comp) {  T value = *last;  if (comp(value, *first)) {    copy_backward(first, last, last + 1);    *first = value;  }  else    __unguarded_linear_insert(last, value, comp);}template <class RandomAccessIterator>void __insertion_sort(RandomAccessIterator first, RandomAccessIterator last) {  if (first == last) return;   for (RandomAccessIterator i = first + 1; i != last; ++i)    __linear_insert(first, i, value_type(first));}template <class RandomAccessIterator, class Compare>void __insertion_sort(RandomAccessIterator first,                      RandomAccessIterator last, Compare comp) {  if (first == last) return;  for (RandomAccessIterator i = first + 1; i != last; ++i)    __linear_insert(first, i, value_type(first), comp);}template <class RandomAccessIterator, class T>void __unguarded_insertion_sort_aux(RandomAccessIterator first,                                     RandomAccessIterator last, T*) {  for (RandomAccessIterator i = first; i != last; ++i)    __unguarded_linear_insert(i, T(*i));}template <class RandomAccessIterator>inline void __unguarded_insertion_sort(RandomAccessIterator first,                                 RandomAccessIterator last) {  __unguarded_insertion_sort_aux(first, last, value_type(first));}template <class RandomAccessIterator, class T, class Compare>void __unguarded_insertion_sort_aux(RandomAccessIterator first,                                     RandomAccessIterator last,                                    T*, Compare comp) {  for (RandomAccessIterator i = first; i != last; ++i)    __unguarded_linear_insert(i, T(*i), comp);}template <class RandomAccessIterator, class Compare>inline void __unguarded_insertion_sort(RandomAccessIterator first,                                        RandomAccessIterator last,                                       Compare comp) {  __unguarded_insertion_sort_aux(first, last, value_type(first), comp);}template <class RandomAccessIterator>void __final_insertion_sort(RandomAccessIterator first,                             RandomAccessIterator last) {  if (last - first > __stl_threshold) {    __insertion_sort(first, first + __stl_threshold);    __unguarded_insertion_sort(first + __stl_threshold, last);  }  else    __insertion_sort(first, last);}template <class RandomAccessIterator, class Compare>void __final_insertion_sort(RandomAccessIterator first,                             RandomAccessIterator last, Compare comp) {  if (last - first > __stl_threshold) {    __insertion_sort(first, first + __stl_threshold, comp);    __unguarded_insertion_sort(first + __stl_threshold, last, comp);  }  else    __insertion_sort(first, last, comp);}template <class Size>inline Size __lg(Size n) {  Size k;  for (k = 0; n > 1; n >>= 1) ++k;  return k;}template <class RandomAccessIterator, class T, class Size>void __introsort_loop(RandomAccessIterator first,                      RandomAccessIterator last, T*,                      Size depth_limit) {  while (last - first > __stl_threshold) {    if (depth_limit == 0) {      partial_sort(first, last, last);      return;    }    --depth_limit;    RandomAccessIterator cut = __unguarded_partition      (first, last, T(__median(*first, *(first + (last - first)/2),                               *(last - 1))));    __introsort_loop(cut, last, value_type(first), depth_limit);    last = cut;  }}template <class RandomAccessIterator, class T, class Size, class Compare>void __introsort_loop(RandomAccessIterator first,                      RandomAccessIterator last, T*,                      Size depth_limit, Compare comp) {  while (last - first > __stl_threshold) {    if (depth_limit == 0) {      partial_sort(first, last, last, comp);      return;    }    --depth_limit;    RandomAccessIterator cut = __unguarded_partition      (first, last, T(__median(*first, *(first + (last - first)/2),                               *(last - 1), comp)), comp);    __introsort_loop(cut, last, value_type(first), depth_limit, comp);    last = cut;  }}template <class RandomAccessIterator>inline void sort(RandomAccessIterator first, RandomAccessIterator last) {  if (first != last) {    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2);    __final_insertion_sort(first, last);  }}template <class RandomAccessIterator, class Compare>inline void sort(RandomAccessIterator first, RandomAccessIterator last,                 Compare comp) {  if (first != last) {    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2,                     comp);    __final_insertion_sort(first, last, comp);  }}template <class RandomAccessIterator>void __inplace_stable_sort(RandomAccessIterator first,                           RandomAccessIterator last) {  if (last - first < 15) {    __insertion_sort(first, last);    return;  }  RandomAccessIterator middle = first + (last - first) / 2;  __inplace_stable_sort(first, middle);  __inplace_stable_sort(middle, last);  __merge_without_buffer(first, middle, last, middle - first, last - middle);}template <class RandomAccessIterator, class Compare>void __inplace_stable_sort(RandomAccessIterator first,                           RandomAccessIterator last, Compare comp) {  if (last - first < 15) {    __insertion_sort(first, last, comp);    return;  }  RandomAccessIterator middle = first + (last - first) / 2;  __inplace_stable_sort(first, middle, comp);  __inplace_stable_sort(middle, last, comp);  __merge_without_buffer(first, middle, last, middle - first,                         last - middle, comp);}template <class RandomAccessIterator1, class RandomAccessIterator2,          class Distance>void __merge_sort_loop(RandomAccessIterator1 first,                       RandomAccessIterator1 last,                        RandomAccessIterator2 result, Distance step_size) {  Distance two_step = 2 * step_size;  while (last - first >= two_step) {    result = merge(first, first + step_size,                   first + step_size, first + two_step, result);    first += two_step;  }  step_size = min(Distance(last - first), step_size);  merge(first, first + step_size, first + step_size, last, result);}template <class RandomAccessIterator1, class RandomAccessIterator2,          class Distance, class Compare>void __merge_sort_loop(RandomAccessIterator1 first,                       RandomAccessIterator1 last,                        RandomAccessIterator2 result, Distance step_size,                       Compare comp) {  Distance two_step = 2 * step_size;  while (last - first >= two_step) {    result = merge(first, first + step_size,                   first + step_size, first + two_step, result, comp);    first += two_step;  }  step_size = min(Distance(last - first), step_size);  merge(first, first + step_size, first + step_size, last, result, comp);}const int __stl_chunk_size = 7;        template <class RandomAccessIterator, class Distance>void __chunk_insertion_sort(RandomAccessIterator first,                             RandomAccessIterator last, Distance chunk_size) {  while (last - first >= chunk_size) {    __insertion_sort(first, first + chunk_size);    first += chunk_size;  }  __insertion_sort(first, last);}template <class RandomAccessIterator, class Distance, class Compare>void __chunk_insertion_sort(RandomAccessIterator first,                             RandomAccessIterator last,                            Distance chunk_size, Compare comp) {  while (last - first >= chunk_size) {    __insertion_sort(first, first + chunk_size, comp);    first += chunk_size;  }  __insertion_sort(first, last, comp);}template <class RandomAccessIterator, class Pointer, class Distance>void __merge_sort_with_buffer(RandomAccessIterator first,                               RandomAccessIterator last,                              Pointer buffer, Distance*) {  Distance len = last - first;  Pointer buffer_last = buffer + len;  Distance step_size = __stl_chunk_size;  __chunk_insertion_sort(first, last, step_size);  while (step_size < len) {    __merge_sort_loop(first, last, buffer, step_size);    step_size *= 2;    __merge_sort_loop(buffer, buffer_last, first, step_size);    step_size *= 2;  }}template <class RandomAccessIterator, class Pointer, class Distance,          class Compare>void __merge_sort_with_buffer(RandomAccessIterator first,                               RandomAccessIterator last, Pointer buffer,                              Distance*, Compare comp) {  Distance len = last - first;  Pointer buffer_last = buffer + len;  Distance step_size = __stl_chunk_size;  __chunk_insertion_sort(first, last, step_size, comp);  while (step_size < len) {    __merge_sort_loop(first, last, buffer, step_size, comp);    step_size *= 2;    __merge_sort_loop(buffer, buffer_last, first, step_size, comp);    step_size *= 2;  }}template <class RandomAccessIterator, class Pointer, class Distance>void __stable_sort_adaptive(RandomAccessIterator first,                             RandomAccessIterator last, Pointer buffer,                            Distance buffer_size) {

⌨️ 快捷键说明

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