📄 qalgorithms.h
字号:
Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value){ // Implementation is duplicated from QAlgorithmsPrivate. RandomAccessIterator middle; int n = end - begin; int half; while (n > 0) { 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, typename T, typename LessThan>Q_OUTOFLINE_TEMPLATE void qStableSortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan){ const int span = end - start; if (span < 2) return; // Split in half and sort halves. RandomAccessIterator middle = start + span / 2; qStableSortHelper(start, middle, t, lessThan); qStableSortHelper(middle, end, t, lessThan); // Merge RandomAccessIterator lo = start; RandomAccessIterator hi = middle; while (lo != middle && hi != end) { if (!lessThan(*hi, *lo)) { ++lo; // OK, *lo is in its correct position } else { // Move *hi to lo's position, shift values // between lo and hi - 1 one place up. T value = *hi; for (RandomAccessIterator i = hi; i != lo; --i) { *i = *(i-1); } *lo = value; ++hi; ++lo; ++middle; } }}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 + -