📄 qalgorithms.h
字号:
half = n >> 1; middle = begin + half; if (value < *middle) { n = half; } else { begin = middle + 1; n -= half + 1; } } return begin;}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan){ return QAlgorithmsPrivate::qUpperBoundHelper(begin, end, value, lessThan);}template <typename Container, typename T>Q_OUTOFLINE_TEMPLATE typename Container::const_iterator qUpperBound(const Container &container, const T &value){ return QAlgorithmsPrivate::qUpperBoundHelper(container.constBegin(), container.constEnd(), value, qLess<T>());}template <typename RandomAccessIterator, typename T>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value){ // Implementation is duplicated from QAlgorithmsPrivate. int l = 0; int r = end - begin - 1; if (r < 0) return end; int i = (l + r + 1) / 2; while (r != l) { if (value < begin[i]) r = i - 1; else l = i; i = (l + r + 1) / 2; } if (begin[i] < value || value < begin[i]) return end; else return begin + i;}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan){ return QAlgorithmsPrivate::qBinaryFindHelper(begin, end, value, lessThan);}template <typename Container, typename T>Q_OUTOFLINE_TEMPLATE typename Container::const_iterator qBinaryFind(const Container &container, const T &value){ return QAlgorithmsPrivate::qBinaryFindHelper(container.constBegin(), container.constEnd(), value, qLess<T>());}template <typename ForwardIterator>Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end){ while (begin != end) { delete *begin; ++begin; }}template <typename Container>inline void qDeleteAll(const Container &c){ qDeleteAll(c.begin(), c.end());}/* Warning: The contents of QAlgorithmsPrivate is not a part of the public Qt API and may be changed from version to version or even be completely removed.*/namespace QAlgorithmsPrivate {template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE void qSortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan){top: int span = end - start; if (span < 2) return; --end; RandomAccessIterator low = start, high = end - 1; RandomAccessIterator pivot = start + span / 2; if (lessThan(*end, *start)) qSwap(*end, *start); if (span == 2) return; if (lessThan(*pivot, *start)) qSwap(*pivot, *start); if (lessThan(*end, *pivot)) qSwap(*end, *pivot); if (span == 3) return; qSwap(*pivot, *end); while (low < high) { while (low < high && lessThan(*low, *end)) ++low; while (high > low && lessThan(*end, *high)) --high; if (low < high) { qSwap(*low, *high); ++low; --high; } else { break; } } if (lessThan(*low, *end)) ++low; qSwap(*end, *low); qSortHelper(start, low, t, lessThan); start = low + 1; ++end; goto top;}template <typename RandomAccessIterator, typename T>inline void qSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &dummy){ qSortHelper(begin, end, dummy, qLess<T>());}template <typename RandomAccessIterator>Q_OUTOFLINE_TEMPLATE void qReverse(RandomAccessIterator begin, RandomAccessIterator end){ --end; while (begin < end) qSwap(*begin++, *end--);}template <typename RandomAccessIterator>Q_OUTOFLINE_TEMPLATE void qRotate(RandomAccessIterator begin, RandomAccessIterator middle, RandomAccessIterator end){ qReverse(begin, middle); qReverse(middle, end); qReverse(begin, end); }template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE void qMerge(RandomAccessIterator begin, RandomAccessIterator pivot, RandomAccessIterator end, T &t, LessThan lessThan){ const int len1 = pivot - begin; const int len2 = end - pivot; if (len1 == 0 || len2 == 0) return; if (len1 + len2 == 2) { if (lessThan(*(begin + 1), *(begin))) qSwap(*begin, *(begin + 1)); return; } RandomAccessIterator firstCut; RandomAccessIterator secondCut; int len2Half; if (len1 > len2) { const int len1Half = len1 / 2; firstCut = begin + len1Half; secondCut = qLowerBound(pivot, end, *firstCut, lessThan); len2Half = secondCut - pivot; } else { len2Half = len2 / 2; secondCut = pivot + len2Half; firstCut = qUpperBound(begin, pivot, *secondCut, lessThan); } qRotate(firstCut, pivot, secondCut); const RandomAccessIterator newPivot = firstCut + len2Half; qMerge(begin, firstCut, newPivot, t, lessThan); qMerge(newPivot, secondCut, end, t, lessThan);}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE void qStableSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &t, LessThan lessThan){ const int span = end - begin; if (span < 2) return; const RandomAccessIterator middle = begin + span / 2; qStableSortHelper(begin, middle, t, lessThan); qStableSortHelper(middle, end, t, lessThan); qMerge(begin, middle, end, t, lessThan);}template <typename RandomAccessIterator, typename T>inline void qStableSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &dummy){ qStableSortHelper(begin, end, dummy, qLess<T>());}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qLowerBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan){ RandomAccessIterator middle; int n = end - begin; int half; while (n > 0) { half = n >> 1; middle = begin + half; if (lessThan(*middle, value)) { begin = middle + 1; n -= half + 1; } else { n = half; } } return begin;}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan){ RandomAccessIterator middle; int n = end - begin; int half; while (n > 0) { half = n >> 1; middle = begin + half; if (lessThan(value, *middle)) { n = half; } else { begin = middle + 1; n -= half + 1; } } return begin;}template <typename RandomAccessIterator, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFindHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan){ int l = 0; int r = end - begin - 1; if (r < 0) return end; int i = (l + r + 1) / 2; while (r != l) { if (lessThan(value, begin[i])) r = i - 1; else l = i; i = (l + r + 1) / 2; } if (lessThan(begin[i], value) || lessThan(value, begin[i])) return end; else return begin + i;}} //namespace QAlgorithmsPrivateQT_END_HEADER#endif // QALGORITHMS_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -