长春网站建设新格,网站文档设置index.php,哪个网站做视频赚钱,上海包装设计策略技术中的算法策略
在之前博客中funcsum()函数模板中#xff0c;实现了对数组元素的求和运算。求和在这里可以看作一种算法#xff0c;扩展一下思路#xff0c;对数组元素求差、求乘积、求最大值和最小值等#xff0c;都可以看作算法。而当前的funcsum()函数模板中实现了对数组元素的求和运算。求和在这里可以看作一种算法扩展一下思路对数组元素求差、求乘积、求最大值和最小值等都可以看作算法。而当前的funcsum()函数模板中已经将数组元素的求和算法固定写在了程序代码中为了灵活地将求和算法调整为求乘积、求最大值等算法可以通过引入一个策略policy类SumPolicy达到目的。
// 求和策略类以实现求和算法
struct SumPolicy
{// 静态成员函数模板templatetypename sumT,typename T // sumT是和值类型T是数组元素类型static void algorithm(sumT sum, const T value) // 该策略类的核心算法{sum value;}
};接着为funcsum()函数模板增加一个新的类型模板参数这个模板参数的默认值就是这个策略类。 修改funcsum()函数模板
templatetypename T,typename U SumFixedTraitsT,typename V SumPolicy
auto funcsum(const T* begin, const T* end)
{typename U::sumT sum U::initValue();for (;;){// sum (*begin); 此行被下面一行取代V::algorithm(sum, *begin);if (begin end)break;begin;}return sum;
}如果要计算一个整型数组中元素的最小值如何实现第1件想到的事情就是写一个新的策略类如这里写一个MinPolicy类仿照SumPolicy类的写法。
struct MinPolicy
{templatetypename minT,typename Tstatic void algorithm(minT min, const T value){if (min value)min value;}
};在main()主函数中重新写入代码
#include killCmake.h#includestringusing namespace std;templatetypename T
struct SumFixedTraits;template
struct SumFixedTraitschar
{using sumT int;static sumT initValue() {return 0;}
};// 最求值策略技术时为了求最小值初始化需要很大
// 所以初始值可以为int最大值21亿
template
struct SumFixedTraitsint
{using sumT __int64;static sumT initValue() {return 2100000000;}
};template
struct SumFixedTraitsdouble
{using sumT double;static sumT initValue() {return 0.0;}
};templatetypename T,typename U SumFixedTraitsT
auto funcsum(const T* begin, const T* end)
{// using sumT typename SumFixedTraitsT::sumT; 本行不需要// sumT sum SumFixedTraitsT::initValue(); 本行不需要typename U::sumT sum U::initValue();for (;;){sum (*begin);if (begin end)break;begin;}return sum;
}// 求和策略类以实现求和算法
struct SumPolicy
{// 静态成员函数模板templatetypename sumT,typename T // sumT是和值类型T是数组元素类型static void algorithm(sumT sum, const T value) // 该策略类的核心算法{sum value;}
};templatetypename T,typename U SumFixedTraitsT,typename V SumPolicy
auto funcsum(const T* begin, const T* end)
{typename U::sumT sum U::initValue();for (;;){// sum (*begin); 此行被下面一行取代V::algorithm(sum, *begin);if (begin end)break;begin;}return sum;
}struct MinPolicy
{templatetypename minT,typename Tstatic void algorithm(minT min, const T value){if (min value)min value;}
};int main()
{//char my_char_array[] abc;//std::cout (int)(funcsum(my_char_array[0], my_char_array[2])) std::endl;//std::cout (int)(funcsumchar, SumFixedTraitsint(my_char_array[0], my_char_array[2])) std::endl;int my_int_array1[] { 10,15,20 };std::cout funcsumint, SumFixedTraitsint, MinPolicy(my_int_array1[0], my_int_array1[2]) std::endl;return 0;
} 这个程序真的很经典个人觉得应该属于中上乘武功了
运行程序看一看新增的代码结果是否正确最开始发现结果为0显然这个结果是不正确的。究其原因在funcsum()中sum用于保存数组元素最小值的变量的初值被设置为0。如果是计算数组元素和值则sum的初值被设置为0是很正常的但如果要计算数组元素的最小值则把sum的初值设置为0是不正常的因为数组中元素的最小值也很可能比0大有这个0存在就无法找到数组中元素的真正最小值。解决方案有以下两个。1可以给funcsum()函数模板增加一个非类型模板参数用于把初值传递进来。2也可以重新写一个固定萃取类模板取代当前的SumFixedTraits模板。这里采用后一种解决方案书写一个新的固定萃取类模板取名为MinFixedTraits。
#include killCmake.h#includestringusing namespace std;templatetypename T
struct SumFixedTraits;template
struct SumFixedTraitschar
{using sumT int;static sumT initValue() {return 0;}
};// 最求值策略技术时为了求最小值初始化需要很大
// 所以初始值可以为int最大值21亿
template
struct SumFixedTraitsint
{using sumT __int64;static sumT initValue() {return 2100000000;}
};template
struct SumFixedTraitsdouble
{using sumT double;static sumT initValue() {return 0.0;}
};templatetypename T
struct MinFixedTraits;template
struct MinFixedTraitsint
{// 求最小值结果类型与元素类型相同即可// 为名字统一都用sumT这个名字using sumT int;static sumT initValue(){// 这里给整型最大值相信任何一个数组元素都不会比这个值更大// 因此可以顺利找到数组元素中的最小值return INT_MAX;}
};// 求和策略类以实现求和算法
struct SumPolicy
{// 静态成员函数模板templatetypename sumT,typename T // sumT是和值类型T是数组元素类型static void algorithm(sumT sum, const T value) // 该策略类的核心算法{sum value;}
};templatetypename T,typename U SumFixedTraitsT,typename V SumPolicy
auto funcsum(const T* begin, const T* end)
{typename U::sumT sum U::initValue();for (;;){// sum (*begin); 此行被下面一行取代V::algorithm(sum, *begin);if (begin end)break;begin;}return sum;
}struct MinPolicy
{templatetypename minT,typename Tstatic void algorithm(minT min, const T value){if (min value)min value;}
};int main()
{int my_int_array1[] { 10,15,20 };std::cout funcsumint, MinFixedTraitsint, MinPolicy( my_int_array1[0], my_int_array1[2]) std::endl;return 0;
} 运行程序新增的代码行结果为10一切正常。