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

📄 stl_algo.h

📁 STL完整源码,实现STL文件的读写和三维体的重建及其分析
💻 H
📖 第 1 页 / 共 5 页
字号:
                                   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(value, *middle))      len = half;    else {      first = middle + 1;      len = len - half - 1;    }  }  return first;}template <class ForwardIterator, class T, class Compare>inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,                                   const T& value, Compare comp) {  return __upper_bound(first, last, value, comp, distance_type(first),                       iterator_category(first));}template <class ForwardIterator, class T, class Distance>pair<ForwardIterator, ForwardIterator>__equal_range(ForwardIterator first, ForwardIterator last, const T& value,              Distance*, forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle, left, right;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (*middle < value) {      first = middle;      ++first;      len = len - half - 1;    }    else if (value < *middle)      len = half;    else {      left = lower_bound(first, middle, value);      advance(first, len);      right = upper_bound(++middle, first, value);      return pair<ForwardIterator, ForwardIterator>(left, right);    }  }  return pair<ForwardIterator, ForwardIterator>(first, first);}template <class RandomAccessIterator, class T, class Distance>pair<RandomAccessIterator, RandomAccessIterator>__equal_range(RandomAccessIterator first, RandomAccessIterator last,              const T& value, Distance*, random_access_iterator_tag) {  Distance len = last - first;  Distance half;  RandomAccessIterator middle, left, right;  while (len > 0) {    half = len >> 1;    middle = first + half;    if (*middle < value) {      first = middle + 1;      len = len - half - 1;    }    else if (value < *middle)      len = half;    else {      left = lower_bound(first, middle, value);      right = upper_bound(++middle, first + len, value);      return pair<RandomAccessIterator, RandomAccessIterator>(left,                                                              right);    }  }  return pair<RandomAccessIterator, RandomAccessIterator>(first, first);}template <class ForwardIterator, class T>inline pair<ForwardIterator, ForwardIterator>equal_range(ForwardIterator first, ForwardIterator last, const T& value) {  return __equal_range(first, last, value, distance_type(first),                       iterator_category(first));}template <class ForwardIterator, class T, class Compare, class Distance>pair<ForwardIterator, ForwardIterator>__equal_range(ForwardIterator first, ForwardIterator last, const T& value,              Compare comp, Distance*, forward_iterator_tag) {  Distance len = 0;  distance(first, last, len);  Distance half;  ForwardIterator middle, left, right;  while (len > 0) {    half = len >> 1;    middle = first;    advance(middle, half);    if (comp(*middle, value)) {      first = middle;      ++first;      len = len - half - 1;    }    else if (comp(value, *middle))      len = half;    else {      left = lower_bound(first, middle, value, comp);      advance(first, len);      right = upper_bound(++middle, first, value, comp);      return pair<ForwardIterator, ForwardIterator>(left, right);    }  }  return pair<ForwardIterator, ForwardIterator>(first, first);}           template <class RandomAccessIterator, class T, class Compare, class Distance>pair<RandomAccessIterator, RandomAccessIterator>__equal_range(RandomAccessIterator first, RandomAccessIterator last,              const T& value, Compare comp, Distance*,              random_access_iterator_tag) {  Distance len = last - first;  Distance half;  RandomAccessIterator middle, left, right;  while (len > 0) {    half = len >> 1;    middle = first + half;    if (comp(*middle, value)) {      first = middle + 1;      len = len - half - 1;    }    else if (comp(value, *middle))      len = half;    else {      left = lower_bound(first, middle, value, comp);      right = upper_bound(++middle, first + len, value, comp);      return pair<RandomAccessIterator, RandomAccessIterator>(left,                                                              right);    }  }  return pair<RandomAccessIterator, RandomAccessIterator>(first, first);}           template <class ForwardIterator, class T, class Compare>inline pair<ForwardIterator, ForwardIterator>equal_range(ForwardIterator first, ForwardIterator last, const T& value,            Compare comp) {  return __equal_range(first, last, value, comp, distance_type(first),                       iterator_category(first));}    template <class ForwardIterator, class T>bool binary_search(ForwardIterator first, ForwardIterator last,                   const T& value) {  ForwardIterator i = lower_bound(first, last, value);  return i != last && !(value < *i);}template <class ForwardIterator, class T, class Compare>bool binary_search(ForwardIterator first, ForwardIterator last, const T& value,                   Compare comp) {  ForwardIterator i = lower_bound(first, last, value, comp);  return i != last && !comp(value, *i);}template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result) {  while (first1 != last1 && first2 != last2) {    if (*first2 < *first1) {      *result = *first2;      ++first2;    }    else {      *result = *first1;      ++first1;    }    ++result;  }  return copy(first2, last2, copy(first1, last1, result));}template <class InputIterator1, class InputIterator2, class OutputIterator,          class Compare>OutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result, Compare comp) {  while (first1 != last1 && first2 != last2) {    if (comp(*first2, *first1)) {      *result = *first2;      ++first2;    }    else {      *result = *first1;      ++first1;    }    ++result;  }  return copy(first2, last2, copy(first1, last1, result));}template <class BidirectionalIterator, class Distance>void __merge_without_buffer(BidirectionalIterator first,                            BidirectionalIterator middle,                            BidirectionalIterator last,                            Distance len1, Distance len2) {  if (len1 == 0 || len2 == 0) return;  if (len1 + len2 == 2) {    if (*middle < *first) iter_swap(first, middle);    return;  }  BidirectionalIterator first_cut = first;  BidirectionalIterator second_cut = middle;  Distance len11 = 0;  Distance len22 = 0;  if (len1 > len2) {    len11 = len1 / 2;    advance(first_cut, len11);    second_cut = lower_bound(middle, last, *first_cut);    distance(middle, second_cut, len22);  }  else {    len22 = len2 / 2;    advance(second_cut, len22);    first_cut = upper_bound(first, middle, *second_cut);    distance(first, first_cut, len11);  }  rotate(first_cut, middle, second_cut);  BidirectionalIterator new_middle = first_cut;  advance(new_middle, len22);  __merge_without_buffer(first, first_cut, new_middle, len11, len22);  __merge_without_buffer(new_middle, second_cut, last, len1 - len11,                         len2 - len22);}template <class BidirectionalIterator, class Distance, class Compare>void __merge_without_buffer(BidirectionalIterator first,                            BidirectionalIterator middle,                            BidirectionalIterator last,                            Distance len1, Distance len2, Compare comp) {  if (len1 == 0 || len2 == 0) return;  if (len1 + len2 == 2) {    if (comp(*middle, *first)) iter_swap(first, middle);    return;  }  BidirectionalIterator first_cut = first;  BidirectionalIterator second_cut = middle;  Distance len11 = 0;  Distance len22 = 0;  if (len1 > len2) {    len11 = len1 / 2;    advance(first_cut, len11);    second_cut = lower_bound(middle, last, *first_cut, comp);    distance(middle, second_cut, len22);  }  else {    len22 = len2 / 2;    advance(second_cut, len22);    first_cut = upper_bound(first, middle, *second_cut, comp);    distance(first, first_cut, len11);  }  rotate(first_cut, middle, second_cut);  BidirectionalIterator new_middle = first_cut;  advance(new_middle, len22);  __merge_without_buffer(first, first_cut, new_middle, len11, len22, comp);  __merge_without_buffer(new_middle, second_cut, last, len1 - len11,                         len2 - len22, comp);}template <class BidirectionalIterator1, class BidirectionalIterator2,          class Distance>BidirectionalIterator1 __rotate_adaptive(BidirectionalIterator1 first,                                         BidirectionalIterator1 middle,                                         BidirectionalIterator1 last,                                         Distance len1, Distance len2,                                         BidirectionalIterator2 buffer,                                         Distance buffer_size) {  BidirectionalIterator2 buffer_end;  if (len1 > len2 && len2 <= buffer_size) {    buffer_end = copy(middle, last, buffer);    copy_backward(first, middle, last);    return copy(buffer, buffer_end, first);  } else if (len1 <= buffer_size) {    buffer_end = copy(first, middle, buffer);    copy(middle, last, first);    return copy_backward(buffer, buffer_end, last);  } else  {    rotate(first, middle, last);    advance(first, len2);    return first;  }}template <class BidirectionalIterator1, class BidirectionalIterator2,          class BidirectionalIterator3>BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,                                        BidirectionalIterator1 last1,                                        BidirectionalIterator2 first2,                                        BidirectionalIterator2 last2,                                        BidirectionalIterator3 result) {  if (first1 == last1) return copy_backward(first2, last2, result);  if (first2 == last2) return copy_backward(first1, last1, result);  --last1;  --last2;  while (true) {    if (*last2 < *last1) {      *--result = *last1;      if (first1 == last1) return copy_backward(first2, ++last2, result);      --last1;    }    else {      *--result = *last2;      if (first2 == last2) return copy_backward(first1, ++last1, result);      --last2;    }  }}template <class BidirectionalIterator1, class BidirectionalIterator2,          class BidirectionalIterator3, class Compare>BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,                                        BidirectionalIterator1 last1,                                        BidirectionalIterator2 first2,                                        BidirectionalIterator2 last2,                                        BidirectionalIterator3 result,                                        Compare comp) {  if (first1 == last1) return copy_backward(first2, last2, result);  if (first2 == last2) return copy_backward(first1, last1, result);  --last1;  --last2;  while (true) {    if (comp(*last2, *last1)) {      *--result = *last1;      if (first1 == last1) return copy_backward(first2, ++last2, result);      --last1;    }    else {      *--result = *last2;      if (first2 == last2) return copy_backward(first1, ++last1, result);      --last2;    }  }}template <class BidirectionalIterator, class Distance, class Pointer>void __merge_adaptive(BidirectionalIterator first,                       BidirectionalIterator middle,                       BidirectionalIterator last, Distance len1, Distance len2,                      Pointer buffer, Distance buffer_size) {  if (len1 <= len2 && len1 <= buffer_size) {    Pointer end_buffer = copy(first, middle, buffer);    merge(buffer, end_buffer, middle, last, first);  }  else if (len2 <= buffer_size) {    Pointer end_buffer = copy(middle, last, buffer);    __merge_backward(first, middle, buffer, end_buffer, last);  }  else {    BidirectionalIterator first_cut = first;    BidirectionalIterator second_cut = middle;    Distance len11 = 0;    Distance len22 = 0;    if (len1 > len2) {      len11 = len1 / 2;      advance(first_cut, len11);      second_cut = lower_bound(middle, last, *first_cut);      distance(middle, second_cut, len22);       }    else {      len22 = len2 / 2;      advance(second_cut, len22);      first_cut = upper_bound(first, middle, *second_cut);      distance(first, first_cut, len11);    }    BidirectionalIterator new_middle =      __rotate_adaptive(first_cut, middle, second_cut, len1 - len11,                        len22, buffer, buffer_size);    __merge_adaptive(first, first_cut, new_middle, len11, len22, buffer,                     buffer_size);    __merge_adaptive(new_middle, second_cut, last, len1 - len11,                     len2 - len22, buffer, buffer_size);  }}template <class BidirectionalIterator, class Distance, class Pointer,          class Compare>void __merge_adaptive(BidirectionalIterator first,                       BidirectionalIterator middle,                       BidirectionalIterator last, Distance len1, Distance len

⌨️ 快捷键说明

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