基于 concept 的归并排序
基于 concept 的归并排序
template <std::random_access_iterator RandomIter, std::random_access_iterator RandomTempIter, typename Comp> requires requires(Comp comp, RandomIter it, RandomTempIter tmp_it) { { comp(*it, *it) } -> std::same_as<bool>; { comp(*tmp_it, *tmp_it) } -> std::same_as<bool>; } constexpr auto MergeSort(RandomIter begin, RandomIter end, RandomTempIter temp_begin, RandomTempIter temp_end, Comp &&comp) -> void { if (begin + 1 == end) { return; } auto mid = begin + (end - begin) / 2; auto temp_mid = temp_begin + (temp_end - temp_begin) / 2; MergeSort(begin, mid, temp_begin, temp_mid, std::forward<Comp>(comp)); MergeSort(mid, end, temp_mid, temp_end, std::forward<Comp>(comp)); auto left_it = begin, right_it = mid; auto tit = temp_begin; while (left_it < mid && right_it < end) { if (comp(*left_it, *right_it)) { *tit = std::move(*left_it); ++left_it; } else { *tit = std::move(*right_it); ++right_it; } ++tit; } while (left_it < mid) { *tit = std::move(*left_it); ++tit; ++left_it; } while (right_it < end) { *tit = std::move(*right_it); ++tit; ++right_it; } while (begin < end) { *begin = std::move(*temp_begin); ++begin; ++temp_begin; } } template <std::random_access_iterator Iter, typename Comp> requires requires(Comp comp, Iter it) { { comp(*it, *it) } -> std::same_as<bool>; } constexpr auto MergeSort(Iter begin, Iter end, Comp &&comp) -> void { std::vector<typename std::iterator_traits<Iter>::value_type> buffer(end - begin); MergeSort(begin, end, std::begin(buffer), std::end(buffer), std::forward<Comp>(comp)); }
本文作者:フランドール·スカーレット
本文链接:https://www.cnblogs.com/FlandreScarlet/p/18069214
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步