目录

简介

上一篇使用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++模板元编程----快速排序的更多相关文章

  1. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  2. C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成

    这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...

  3. C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法

    C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...

  4. 读书笔记_Effective_C++_条款四十八:了解模板元编程

    作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> st ...

  5. c++ 模板元编程的一点体会

    趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...

  6. C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE

    本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...

  7. C++模板元编程 - 2 模仿haskell的列表以及相关操作

    这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D> ...

  8. 一道模板元编程题源码解答(replace_type)

    今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...

  9. effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

随机推荐

  1. CDR中调和工具的使用方法

    CDR中的调和工具也是一个神奇的工具,和AI中的混合工具类似,可以做出很多好看的形状,下面先看下他的基本操作方法. 要了解CorelDRAW平面设计软件中的cdr调和工具怎么用,首先要知道调和工具的作 ...

  2. leetcode137. 只出现一次的数字 II

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗?示例 1:输入: [2,2 ...

  3. SwiftUI:看我展示52张扑克牌,“很快啊!”

    目录 思路 效果图 相关代码解析 枚举创建扑克牌号码 枚举创建扑克牌类型 viewModel逻辑 UI实现 源码 感受 思路 使用 SwiftUI 创建 UI 结构: 使用 swift 的枚举和结构体 ...

  4. flink:StreamGraph转换为JobGraph

    1 转换基本流程 2 简单来看可以分为两部分: 第一部分是通过一些util.translator.generator等类将职责进行解耦.托管和分离,期间涉及FlinkPipelineTranslati ...

  5. Eclipse改字体大小

    Windows ->Perferences ->General ->Appearance ->Colors and Fonts ->Basic ->Text Fon ...

  6. transient关键字的作用以及几个疑问的解决

    目录 1.从Serilizable说到transient 2.序列化属性对象的类需要实现Serilizable接口? 3.不想被序列化的字段怎么办? 4.ArrayList里面的elementData ...

  7. CARDS主题 & 导航栏样式修改

    每个人对于主题样式的感觉是不一样的,譬如字体大小,间距,高宽,距离,颜色等,我们可以一定程度内很直观地去修改主题的某些样式. 首先,在浏览器中利用开发者工具进行调试,找到我们所要改动的那部分结构,写入 ...

  8. websocket简单实现五子棋即时对战功能

    几年前做的一个小demo,代码比较老,先上下html显示效果图 因为代码中注释比较详细,所以就直接上代码了 html代码,也就是上图展示的效果页面 <!DOCTYPE html> < ...

  9. navicat连接阿里云ESC里的数据库

    1.进入阿里云服务器 ssh 用户名@ip 2.进入数据库 mysql -u root -p 3.设置mysql数据库权限(允许其他服务器连接数据库)  grant all privileges on ...

  10. 老猿学5G专栏文章目录

    ☞ ░ 前往老猿Python博文目录 ░ 一.3GPP规范文档及其他推荐阅读博文 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南 老猿学5G扫盲贴:3GPP规范中部分与计费相关的规范序 ...