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

📄 stl_algo.h

📁 STL完整源码,实现STL文件的读写和三维体的重建及其分析
💻 H
📖 第 1 页 / 共 5 页
字号:
  Distance len = (last - first + 1) / 2;  RandomAccessIterator middle = first + len;  if (len > buffer_size) {    __stable_sort_adaptive(first, middle, buffer, buffer_size);    __stable_sort_adaptive(middle, last, buffer, buffer_size);  } else {    __merge_sort_with_buffer(first, middle, buffer, (Distance*)0);    __merge_sort_with_buffer(middle, last, buffer, (Distance*)0);  }  __merge_adaptive(first, middle, last, Distance(middle - first),                    Distance(last - middle), buffer, buffer_size);}template <class RandomAccessIterator, class Pointer, class Distance,           class Compare>void __stable_sort_adaptive(RandomAccessIterator first,                             RandomAccessIterator last, Pointer buffer,                            Distance buffer_size, Compare comp) {  Distance len = (last - first + 1) / 2;  RandomAccessIterator middle = first + len;  if (len > buffer_size) {    __stable_sort_adaptive(first, middle, buffer, buffer_size,                            comp);    __stable_sort_adaptive(middle, last, buffer, buffer_size,                            comp);  } else {    __merge_sort_with_buffer(first, middle, buffer, (Distance*)0, comp);    __merge_sort_with_buffer(middle, last, buffer, (Distance*)0, comp);  }  __merge_adaptive(first, middle, last, Distance(middle - first),                    Distance(last - middle), buffer, buffer_size,                   comp);}template <class RandomAccessIterator, class T, class Distance>inline void __stable_sort_aux(RandomAccessIterator first,                              RandomAccessIterator last, T*, Distance*) {  temporary_buffer<RandomAccessIterator, T> buf(first, last);  if (buf.begin() == 0)    __inplace_stable_sort(first, last);  else     __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()));}template <class RandomAccessIterator, class T, class Distance, class Compare>inline void __stable_sort_aux(RandomAccessIterator first,                              RandomAccessIterator last, T*, Distance*,                              Compare comp) {  temporary_buffer<RandomAccessIterator, T> buf(first, last);  if (buf.begin() == 0)    __inplace_stable_sort(first, last, comp);  else     __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()),                           comp);}template <class RandomAccessIterator>inline void stable_sort(RandomAccessIterator first,                        RandomAccessIterator last) {  __stable_sort_aux(first, last, value_type(first), distance_type(first));}template <class RandomAccessIterator, class Compare>inline void stable_sort(RandomAccessIterator first,                        RandomAccessIterator last, Compare comp) {  __stable_sort_aux(first, last, value_type(first), distance_type(first),                     comp);}template <class RandomAccessIterator, class T>void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,                    RandomAccessIterator last, T*) {  make_heap(first, middle);  for (RandomAccessIterator i = middle; i < last; ++i)    if (*i < *first)       __pop_heap(first, middle, i, T(*i), distance_type(first));  sort_heap(first, middle);}template <class RandomAccessIterator>inline void partial_sort(RandomAccessIterator first,                         RandomAccessIterator middle,                         RandomAccessIterator last) {  __partial_sort(first, middle, last, value_type(first));}template <class RandomAccessIterator, class T, class Compare>void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,                    RandomAccessIterator last, T*, Compare comp) {  make_heap(first, middle, comp);  for (RandomAccessIterator i = middle; i < last; ++i)    if (comp(*i, *first))      __pop_heap(first, middle, i, T(*i), comp, distance_type(first));  sort_heap(first, middle, comp);}template <class RandomAccessIterator, class Compare>inline void partial_sort(RandomAccessIterator first,                         RandomAccessIterator middle,                         RandomAccessIterator last, Compare comp) {  __partial_sort(first, middle, last, value_type(first), comp);}template <class InputIterator, class RandomAccessIterator, class Distance,          class T>RandomAccessIterator __partial_sort_copy(InputIterator first,                                         InputIterator last,                                         RandomAccessIterator result_first,                                         RandomAccessIterator result_last,                                          Distance*, T*) {  if (result_first == result_last) return result_last;  RandomAccessIterator result_real_last = result_first;  while(first != last && result_real_last != result_last) {    *result_real_last = *first;    ++result_real_last;    ++first;  }  make_heap(result_first, result_real_last);  while (first != last) {    if (*first < *result_first)       __adjust_heap(result_first, Distance(0),                    Distance(result_real_last - result_first), T(*first));    ++first;  }  sort_heap(result_first, result_real_last);  return result_real_last;}template <class InputIterator, class RandomAccessIterator>inline RandomAccessIteratorpartial_sort_copy(InputIterator first, InputIterator last,                  RandomAccessIterator result_first,                  RandomAccessIterator result_last) {  return __partial_sort_copy(first, last, result_first, result_last,                              distance_type(result_first), value_type(first));}template <class InputIterator, class RandomAccessIterator, class Compare,          class Distance, class T>RandomAccessIterator __partial_sort_copy(InputIterator first,                                         InputIterator last,                                         RandomAccessIterator result_first,                                         RandomAccessIterator result_last,                                         Compare comp, Distance*, T*) {  if (result_first == result_last) return result_last;  RandomAccessIterator result_real_last = result_first;  while(first != last && result_real_last != result_last) {    *result_real_last = *first;    ++result_real_last;    ++first;  }  make_heap(result_first, result_real_last, comp);  while (first != last) {    if (comp(*first, *result_first))      __adjust_heap(result_first, Distance(0),                    Distance(result_real_last - result_first), T(*first),                    comp);    ++first;  }  sort_heap(result_first, result_real_last, comp);  return result_real_last;}template <class InputIterator, class RandomAccessIterator, class Compare>inline RandomAccessIteratorpartial_sort_copy(InputIterator first, InputIterator last,                  RandomAccessIterator result_first,                  RandomAccessIterator result_last, Compare comp) {  return __partial_sort_copy(first, last, result_first, result_last, comp,                             distance_type(result_first), value_type(first));}template <class RandomAccessIterator, class T>void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,                   RandomAccessIterator last, T*) {  while (last - first > 3) {    RandomAccessIterator cut = __unguarded_partition      (first, last, T(__median(*first, *(first + (last - first)/2),                               *(last - 1))));    if (cut <= nth)      first = cut;    else       last = cut;  }  __insertion_sort(first, last);}template <class RandomAccessIterator>inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,                        RandomAccessIterator last) {  __nth_element(first, nth, last, value_type(first));}template <class RandomAccessIterator, class T, class Compare>void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,                   RandomAccessIterator last, T*, Compare comp) {  while (last - first > 3) {    RandomAccessIterator cut = __unguarded_partition      (first, last, T(__median(*first, *(first + (last - first)/2),                                *(last - 1), comp)), comp);    if (cut <= nth)      first = cut;    else       last = cut;  }  __insertion_sort(first, last, comp);}template <class RandomAccessIterator, class Compare>inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,                 RandomAccessIterator last, Compare comp) {  __nth_element(first, nth, last, value_type(first), comp);}template <class ForwardIterator, class T, class Distance>ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,                              const T& value, Distance*,                              forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (*middle < value) {      first = middle;      ++first;      len = len - half - 1;    }    else      len = half;  }  return first;}template <class RandomAccessIterator, class T, class Distance>RandomAccessIterator __lower_bound(RandomAccessIterator first,                                   RandomAccessIterator last, const T& value,                                   Distance*, random_access_iterator_tag) {  Distance len = last - first;  Distance half;  RandomAccessIterator middle;  while (len > 0) {    half = len >> 1;    middle = first + half;    if (*middle < value) {      first = middle + 1;      len = len - half - 1;    }    else      len = half;  }  return first;}template <class ForwardIterator, class T>inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,                                   const T& value) {  return __lower_bound(first, last, value, distance_type(first),                       iterator_category(first));}template <class ForwardIterator, class T, class Compare, class Distance>ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,                              const T& value, Compare comp, Distance*,                              forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (comp(*middle, value)) {      first = middle;      ++first;      len = len - half - 1;    }    else      len = half;  }  return first;}template <class RandomAccessIterator, class T, class Compare, class Distance>RandomAccessIterator __lower_bound(RandomAccessIterator first,                                   RandomAccessIterator last,                                   const T& value, Compare comp, Distance*,                                   random_access_iterator_tag) {  Distance len = last - first;  Distance half;  RandomAccessIterator middle;  while (len > 0) {    half = len >> 1;    middle = first + half;    if (comp(*middle, value)) {      first = middle + 1;      len = len - half - 1;    }    else      len = half;  }  return first;}template <class ForwardIterator, class T, class Compare>inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,                                   const T& value, Compare comp) {  return __lower_bound(first, last, value, comp, distance_type(first),                       iterator_category(first));}template <class ForwardIterator, class T, class Distance>ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,                              const T& value, Distance*,                              forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (value < *middle)      len = half;    else {      first = middle;      ++first;      len = len - half - 1;    }  }  return first;}template <class RandomAccessIterator, class T, class Distance>RandomAccessIterator __upper_bound(RandomAccessIterator first,                                   RandomAccessIterator last, const T& value,                                   Distance*, random_access_iterator_tag) {  Distance len = last - first;  Distance half;  RandomAccessIterator middle;  while (len > 0) {    half = len >> 1;    middle = first + half;    if (value < *middle)      len = half;    else {      first = middle + 1;      len = len - half - 1;    }  }  return first;}template <class ForwardIterator, class T>inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,                                   const T& value) {  return __upper_bound(first, last, value, distance_type(first),                       iterator_category(first));}template <class ForwardIterator, class T, class Compare, class Distance>ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,                              const T& value, Compare comp, Distance*,                              forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (comp(value, *middle))      len = half;    else {      first = middle;      ++first;      len = len - half - 1;    }  }  return first;}template <class RandomAccessIterator, class T, class Compare, class Distance>RandomAccessIterator __upper_bound(RandomAccessIterator first,

⌨️ 快捷键说明

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