📄 vcl_algorithm.h
字号:
RandomAccessIterator result_last,
Compare comp, Distance*, T*) {
if (result_first == result_last) return result_last;
RandomAccessIterator result_real_last = result_first;
for (; first != last && result_real_last != result_last; ++result_real_last,++first)
*result_real_last = *first;
vcl_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;
}
vcl_sort_heap(result_first, result_real_last, comp);
return result_real_last;
}
template <class InputIterator, class RandomAccessIterator, class Compare>
inline RandomAccessIterator
vcl_partial_sort_copy(InputIterator first, InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last, Compare comp) {
__stl_debug_check(__check_range(first, last));
__stl_debug_check(__check_range(result_first, result_last));
return __partial_sort_copy(first, last, result_first, result_last, comp,
distance_type(result_first), value_type(first));
}
template <class RandomAccessIterator, class T>
inline
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 vcl_nth_element(RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last) {
__stl_debug_check(__check_range(nth,first, last));
__nth_element(first, nth, last, value_type(first));
}
template <class RandomAccessIterator, class T, class Compare>
inline
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 vcl_nth_element(RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last, Compare comp) {
__stl_debug_check(__check_range(nth, first, last));
__nth_element(first, nth, last, value_type(first), comp);
}
template <class ForwardIterator, class T, class Distance>
inline
ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
const T& value, Distance*,
vcl_forward_iterator_tag) {
Distance len = 0;
vcl_distance(first, last, len);
Distance half;
ForwardIterator middle;
while (len > 0) {
half = len / 2;
middle = first;
vcl_advance(middle, half);
if (*middle < value) {
first = middle;
++first;
len = len - half - 1;
} else
len = half;
}
return first;
}
template <class ForwardIterator, class T, class Distance>
inline ForwardIterator __lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value, Distance*,
vcl_bidirectional_iterator_tag) {
return __lower_bound(first, last, value, (Distance*)0,
vcl_forward_iterator_tag());
}
template <class RandomAccessIterator, class T, class Distance>
inline
RandomAccessIterator __lower_bound(RandomAccessIterator first,
RandomAccessIterator last, const T& value,
Distance*, vcl_random_access_iterator_tag) {
Distance len = last - first;
Distance half;
RandomAccessIterator middle;
while (len > 0) {
half = len / 2;
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 vcl_lower_bound(ForwardIterator first, ForwardIterator last,
const T& value) {
__stl_debug_check(__check_range(first, last));
return __lower_bound(first, last, value, distance_type(first),
iterator_category(first));
}
template <class ForwardIterator, class T, class Compare, class Distance>
inline
ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp, Distance*,
vcl_forward_iterator_tag) {
Distance len = 0;
vcl_distance(first, last, len);
Distance half;
ForwardIterator middle;
while (len > 0) {
half = len / 2;
middle = first;
vcl_advance(middle, half);
if (comp(*middle, value)) {
first = middle;
++first;
len = len - half - 1;
} else
len = half;
}
return first;
}
template <class ForwardIterator, class T, class Compare, class Distance>
inline ForwardIterator __lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value, Compare comp, Distance*,
vcl_bidirectional_iterator_tag) {
return __lower_bound(first, last, value, comp, (Distance*)0,
vcl_forward_iterator_tag());
}
template <class RandomAccessIterator, class T, class Compare, class Distance>
inline
RandomAccessIterator __lower_bound(RandomAccessIterator first,
RandomAccessIterator last,
const T& value, Compare comp, Distance*,
vcl_random_access_iterator_tag) {
Distance len = last - first;
Distance half;
RandomAccessIterator middle;
while (len > 0) {
half = len / 2;
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 vcl_lower_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp) {
__stl_debug_check(__check_range(first, last));
return __lower_bound(first, last, value, comp, distance_type(first),
iterator_category(first));
}
template <class ForwardIterator, class T, class Distance>
inline
ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
const T& value, Distance*,
vcl_forward_iterator_tag) {
Distance len = 0;
vcl_distance(first, last, len);
Distance half;
ForwardIterator middle;
while (len > 0) {
half = len / 2;
middle = first;
vcl_advance(middle, half);
if (value < *middle)
len = half;
else {
first = middle;
++first;
len = len - half - 1;
}
}
return first;
}
template <class ForwardIterator, class T, class Distance>
inline ForwardIterator __upper_bound(ForwardIterator first,
ForwardIterator last,
const T& value, Distance*,
vcl_bidirectional_iterator_tag) {
return __upper_bound(first, last, value, (Distance*)0,
vcl_forward_iterator_tag());
}
template <class RandomAccessIterator, class T, class Distance>
inline
RandomAccessIterator __upper_bound(RandomAccessIterator first,
RandomAccessIterator last, const T& value,
Distance*, vcl_random_access_iterator_tag) {
Distance len = last - first;
Distance half;
RandomAccessIterator middle;
while (len > 0) {
half = len / 2;
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 vcl_upper_bound(ForwardIterator first, ForwardIterator last,
const T& value) {
__stl_debug_check(__check_range(first, last));
return __upper_bound(first, last, value, distance_type(first),
iterator_category(first));
}
template <class ForwardIterator, class T, class Compare, class Distance>
inline
ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp, Distance*,
vcl_forward_iterator_tag) {
Distance len = 0;
vcl_distance(first, last, len);
Distance half;
ForwardIterator middle;
while (len > 0) {
half = len / 2;
middle = first;
vcl_advance(middle, half);
if (comp(value, *middle))
len = half;
else {
first = middle;
++first;
len = len - half - 1;
}
}
return first;
}
template <class ForwardIterator, class T, class Compare, class Distance>
inline ForwardIterator __upper_bound(ForwardIterator first,
ForwardIterator last,
const T& value, Compare comp, Distance*,
vcl_bidirectional_iterator_tag) {
return __upper_bound(first, last, value, comp, (Distance*)0,
vcl_forward_iterator_tag());
}
template <class RandomAccessIterator, class T, class Compare, class Distance>
inline
RandomAccessIterator __upper_bound(RandomAccessIterator first,
RandomAccessIterator last,
const T& value, Compare comp, Distance*,
vcl_random_access_iterator_tag) {
Distance len = last - first;
Distance half;
RandomAccessIterator middle;
while (len > 0) {
half = len / 2;
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 vcl_upper_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp) {
__stl_debug_check(__check_range(first, last));
return __upper_bound(first, last, value, comp, distance_type(first),
iterator_category(first));
}
template <class ForwardIterator, class T, class Distance>
inline
vcl_pair<ForwardIterator, ForwardIterator>
__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
Distance*, vcl_forward_iterator_tag) {
Distance len = 0;
vcl_distance(first, last, len);
Distance half;
ForwardIterator middle, left, right;
while (len > 0) {
half = len / 2;
middle = first;
vcl_advance(middle, half);
if (*middle < value) {
first = middle;
++first;
len = len - half - 1;
} else if (value < *middle)
len = half;
else {
left = vcl_lower_bound(first, middle, value);
vcl_advance(first, len);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -