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++实现的并且可以在 ...
随机推荐
- 执行文件异常报错:ImportError: attempted relative import with no known parent package
这个问题困扰了我很久了,网上的解决方法都很一致,找来找去都是一样的解决方法,在导入包的文件和执行文件加入 1 print('__file__={0:<35} | __name__={1:< ...
- Java之 函数(五)
第一部分 : IDEA开发工具 1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 ...
- HEXO | 给博客添加RSS
Hexo是一个简洁.高效.易用的博客框架,同时它拥有十分丰富的主题环境,本次我们所谈到的是cards主题,但是该主题的原生环境里没有相关的rss配置,所以我们需要采用手动添加的方式,进而实现rss功能 ...
- Java继承的两道实验题目
设计一个表示二维平面上点的类Point,包含有表示坐标位置的Protect类型的成员变量 获取和设置x和y值的public方法 package classwork_6; public class Po ...
- 关于String的matches方法
弊端: 虽然String.matches方法最易于看一个字符串是否与正则表达式相匹配.但并不适合在注重性能的情形中重复使用. 问题在于,它内部为正则表达式创建了一个Pattern实例,却只用一次,之后 ...
- shardingsphere与分布式事务
rt https://blog.csdn.net/l1028386804/article/details/79769043 https://blog.csdn.net/qq_20387013/arti ...
- Apache Beam,批处理和流式处理的融合!
1. 概述 在本教程中,我们将介绍 Apache Beam 并探讨其基本概念. 我们将首先演示使用 Apache Beam 的用例和好处,然后介绍基本概念和术语.之后,我们将通过一个简单的例子来说明 ...
- Leetcode 021 Merge Two Sorted Lists
摘要:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...
- LeetCode 048 Rotate Image
题目要求:Rotate Image You are given an n x n 2D matrix representing an image. Rotate the image by 90 deg ...
- Qt实现客户端与服务器消息发送与文件传输
Qt实现客户端与服务器消息发送与文件传输需要使用到 QTcpSocket:提供套接字QTcpServer:提供基于TCP的服务端,官方文档的解释如下: This class makes it poss ...