C++模板元编程----快速排序
目录
简介
上一篇使用C++模板模板实现了一个选择排序。这一次,更进一步的,实现了一个快速排序算法。关于快速排序的可以看这一篇文章快速排序
实现
和上一次一样,我把快速排序算法分为几个小的步骤,分别实现,然后联合在一起,实现算法。
数据结构定义
和之前类似,不过多定义了一个head_type
,同时对一些类型进行了改名。
// 数据结构定义
template<int ...>
struct mvector;
template<int ...data, int _head>
struct mvector<_head, data...> {
constexpr static int head = _head;
typedef mvector<_head> head_type;
typedef mvector<data...> tail_type;
constexpr static std::array<int, 1 + sizeof...(data)> value = {_head, data...};
};
template<int _head>
struct mvector<_head> {
constexpr static int head = _head;
typedef mvector<_head> head_type;
typedef mvector<> tail_type;
constexpr static std::array<int, 1> value = {_head};
};
template<>
struct mvector<> {
constexpr static int head = -1;
typedef mvector<> head_type;
typedef mvector<> tail_type;
constexpr static std::array<int, 0> value = {};
};
在数组前添加一个元素
// 在数组前增加一个元素
template<int data, typename list>
struct add_to_list;
template<int data, int ...data_list>
struct add_to_list<data, mvector<data_list...>> {
typedef mvector<data, data_list...> result_type;
};
判断
// 判断,输出一个类型
template<bool, typename T, typename S>
struct m_type_if;
template<typename T, typename S>
struct m_type_if<true, T, S> {
typedef T result_type;
typedef S not_result_type;
};
template<typename T, typename S>
struct m_type_if<false, T, S> {
typedef S result_type;
typedef T not_result_type;
};
分堆
根据第一个元素,将不同的元素分在不同的数组中
// 分堆
template<typename , typename>
struct m_diff;
template<typename _mid, int ...data, int data_head>
struct m_diff<_mid, mvector<data_head, data...>> {
typedef _mid mid;
typedef m_diff<_mid, mvector<data...>> next_type;
typedef typename m_type_if<data_head < mid::head, typename add_to_list<data_head, typename next_type::right_type>::result_type, typename next_type::right_type>::result_type right_type;
typedef typename m_type_if<data_head >= mid::head, typename add_to_list<data_head, typename next_type::left_type>::result_type, typename next_type::left_type>::result_type left_type;
};
template<typename _mid>
struct m_diff<_mid, mvector<>> {
typedef _mid mid;
typedef m_diff<_mid, mvector<>> next_type;
typedef mvector<> right_type;
typedef mvector<> left_type;
};
合并
// 合并
template<typename, typename, typename>
struct combine_result;
template<int ...data_S, int mid, int ...data_T>
struct combine_result<mvector<data_S...>, mvector<mid>, mvector<data_T...>> {
typedef mvector<data_S..., mid, data_T...> result_type;
};
快速排序的实现
// 快排
template<typename data>
struct QuickSortWork;
template<int ...data>
struct QuickSortWork<mvector<data...>> {
typedef m_diff<typename mvector<data...>::head_type, typename mvector<data...>::tail_type> diffed_type;
typedef typename QuickSortWork<typename diffed_type::right_type>::result_type right_type;
typedef typename QuickSortWork<typename diffed_type::left_type>::result_type left_type;
typedef typename combine_result<right_type, typename mvector<data...>::head_type, left_type>::result_type result_type;
};
template<>
struct QuickSortWork<mvector<>> {
typedef mvector<> result_type;
};
template<int ...data>
struct QuickSort {
typedef QuickSortWork<mvector<data...>> work_type;
constexpr static std::array<int, sizeof...(data)> result = work_type::result_type::value;
};
总结
源代码:https://gist.github.com/ink19/2dd0c466db4a11611a9b75e78dd25b4e
和之前的感觉类似,不过使用更加顺手了。
博客原文:博客原文:https://www.cnblogs.com/ink19/p/cpp_template_quick_sort.html
C++模板元编程----快速排序的更多相关文章
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...
- C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法
C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...
- 读书笔记_Effective_C++_条款四十八:了解模板元编程
作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> st ...
- c++ 模板元编程的一点体会
趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...
- C++模板元编程 - 2 模仿haskell的列表以及相关操作
这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D> ...
- 一道模板元编程题源码解答(replace_type)
今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...
- effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
随机推荐
- CorelDRAW 2017提示已安装另一版本导致安装失败的解决办法
Coreldraw提示"由于您已安装了另一版本,因此无法安装本产品.要安装本产品,您必须首先卸载现有版本"的情况在Coreldraw X8及Coreldraw 2017上都存在,下 ...
- input[type=file] 样式美化,input上传按钮美化
<style>.file { position: relative; display: inline-block; background: #D0EEFF; border: 1px sol ...
- CF980C Posterized
先来吐槽一下这个 sb 翻译,根本就没做过题吧-- 大概就是让你给值域分成连续的几组,每组大小不能超过 \(k\),然后将序列中的值全部替换成其组内的最小值,要使得序列的字典序最小. 因为是字典序,所 ...
- serialVersionUID作用是什么以及如何生成的?
目录 正常不设置serialVersionUID 的序列化和反序列化 序列化之后,类文件增加了字段,反序列化会怎么样? 指定serialVersionUID,减少或者增加字段会发生什么? serial ...
- spring bean注册和实例化
1.左边3个接口定义了基本的Ioc容器的2.HierarchicalBeanFactory增加了getParentBeanFactory()具备了双亲Ioc的管理能力3.ConfigurableBea ...
- 06_Intent和IntentFilter
Intent是同一个或不同的应用中的组件之间的消息传递的媒介,是一个将要执行动作的抽象描述,一般来说是作为参数来使用. Intent描述要启动的基本组件: IntentFilter对组件进行过滤. 下 ...
- gulp常用配置
由于项目中经常会使用到gulp,而每次配置大概都差不多,所以将配置记录一下 项目结构 ├─dist │ ├─assets │ ├─css │ ├─images │ └─js ├─node_module ...
- 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot
目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...
- 【2020.11.28提高组模拟】T2 序列(array)
序列(array) 题目描述 给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...
- 日志聚合工具之 Loki
本文使用的 Loki 和 Promtail 版本为 1.6.1,Grafana 版本为 7.2.0:部署在 Linux 服务器 Loki 负责日志的存储和查询:Promtail 负责日志的采集并推送给 ...