栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用元模版编程将传统冒泡排序性能提升两倍以上

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用元模版编程将传统冒泡排序性能提升两倍以上

在普通的C++下就算把代码优化到极致依旧想提升性能怎么办,那么就把目光投向元模版编程上面了,在编译期间展开的计算方式可以大大降低同样问题计算下的计算量

C++ 模板最初是为实现泛型编程设计的,但是发现原模版编程是图灵完备的(Turing-complete),也就是说,利用元模版编程可以完成任何计算,但是设计之初并不是为了这个,算是意外之喜吧,但是由于开始设计的原因,所以造成了元模版实现的代码很丑陋,属于函数编程的一种

代码如下:

#include

//模板元编程冒泡排序
//函数①,比较两个数字,并交换两个数字
template
void Swap(int* data) { 
    if(data[i]>data[j]) std::swap(data[i], data[j]);
}

//函数②,将进行一次冒泡排序,将一元素放于末端
template
void BubbleSort(int* data) { // 一次冒泡
    Swap(data); //将j和j+1比较并交换
    BubbleSort(data); //将j和j+1传入本函数②中进行比较
}
//函数③,当j
void BubbleSort<0, 0>(int*) { }

//函数④,当展开大小为n的时候
template
void BubbleSort(int* data) { 
	BubbleSort(data); //直接进入本函数④继续展开
    BubbleSort(data);  //展开0到n-1的函数,展开后进入③
}

//函数⑤,当展开到剩下1的时候停止展开
template<>
void BubbleSort<1>(int* data) { }


int main() {
	int inidata[10] = { 3,4,2,1,5,5,9,2,0,4 };
	BubbleSort<10>(inidata); //将数组开始展开
	for(int i=0;i<10;i++)
	{
		std::cout< 

在以上函数中,比普通版本的冒泡排序用时少了一倍,但是在编译时期展开费时间,而且展开后会造成生成文件大,在一些特定场景下以空间换时间还是非常值得的

另外这个函数可以将BubbleSort中的函数直接变为inline函数,直接将代码展开到函数内部,从而避免函数调用的开销从而达到极致的时间开销

#include

//模板元编程冒泡排序
//函数①交换两个数字
template
void inline Swap(int* data) { 
    if(data[i]>data[j]) std::swap(data[i], data[j]);
}

//函数②,将进行一次冒泡排序,将一元素放于末端
template
void inline BubbleSort(int* data) { // 一次冒泡,将前 i 个元素中最大的置换到最后
    Swap(data);
    BubbleSort(data);
}
//函数③
template<>
void inline BubbleSort<0, 0>(int*) { }

//函数④,当展开大小为n的时候
template
void BubbleSort(int* data) { 
	BubbleSort(data); //直接进入本函数④继续展开
    BubbleSort(data);  //展开0到n-1的函数,展开后进入③
}

//函数⑤,当展开到剩下1的时候结束
template<>
void inline BubbleSort<1>(int* data) { }


int main() {
	int sdata[10] = { 3,4,2,1,5,5,9,2,0,4 };
	BubbleSort<10>(sdata); //将数组开始展开
	for(int i=0;i<10;i++)
	{
		std::cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号