C++新經典模板與泛型編程:策略技術中的算法策略

策略技術中的算法策略

  • 在之前博客中funcsum()函數模板中,實現了對數組元素的求和運算。求和在這里可以看作一種算法,擴展一下思路,對數組元素求差、求乘積、求最大值和最小值等,都可以看作算法。
  • 而當前的funcsum()函數模板中,已經將數組元素的求和算法固定寫在了程序代碼中,為了靈活地將求和算法調整為求乘積、求最大值等算法,可以通過引入一個策略(policy)類SumPolicy達到目的。
// 求和策略類以實現求和算法
struct SumPolicy
{// 靜態成員函數模板template<typename sumT,typename T> // sumT是和值類型,T是數組元素類型static void algorithm(sumT& sum, const T& value) // 該策略類的核心算法{sum += value;}
};

接著,為funcsum()函數模板增加一個新的類型模板參數,這個模板參數的默認值就是這個策略類。
修改funcsum()函數模板

template<typename T,typename U = SumFixedTraits<T>,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
{template<typename minT,typename T>static void algorithm(minT& min, const T& value){if (min > value)min = value;}
};

main()主函數中重新寫入代碼:

#include "killCmake.h"#include<string>using namespace std;template<typename T>
struct SumFixedTraits;template<>
struct SumFixedTraits<char>
{using sumT = int;static sumT initValue() {return 0;}
};// 最求值策略技術時,為了求最小值,初始化需要很大
// 所以初始值可以為int最大值21億
template<>
struct SumFixedTraits<int>
{using sumT = __int64;static sumT initValue() {return 2100000000;}
};template<>
struct SumFixedTraits<double>
{using sumT = double;static sumT initValue() {return 0.0;}
};template<typename T,typename U = SumFixedTraits<T>>
auto funcsum(const T* begin, const T* end)
{// using sumT = typename SumFixedTraits<T>::sumT;  本行不需要// sumT sum = SumFixedTraits<T>::initValue();  本行不需要typename U::sumT sum = U::initValue();for (;;){sum += (*begin);if (begin == end)break;++begin;}return sum;
}// 求和策略類以實現求和算法
struct SumPolicy
{// 靜態成員函數模板template<typename sumT,typename T> // sumT是和值類型,T是數組元素類型static void algorithm(sumT& sum, const T& value) // 該策略類的核心算法{sum += value;}
};template<typename T,typename U = SumFixedTraits<T>,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
{template<typename minT,typename T>static 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)(funcsum<char, SumFixedTraits<int>>(&my_char_array[0], &my_char_array[2])) << std::endl;int my_int_array1[] = { 10,15,20 };std::cout << funcsum<int, SumFixedTraits<int>, 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"#include<string>using namespace std;template<typename T>
struct SumFixedTraits;template<>
struct SumFixedTraits<char>
{using sumT = int;static sumT initValue() {return 0;}
};// 最求值策略技術時,為了求最小值,初始化需要很大
// 所以初始值可以為int最大值21億
template<>
struct SumFixedTraits<int>
{using sumT = __int64;static sumT initValue() {return 2100000000;}
};template<>
struct SumFixedTraits<double>
{using sumT = double;static sumT initValue() {return 0.0;}
};template<typename T>
struct MinFixedTraits;template<>
struct MinFixedTraits<int>
{// 求最小值,結果類型與元素類型相同即可// 為名字統一,都用sumT這個名字using sumT = int;static sumT initValue(){// 這里給整型最大值,相信任何一個數組元素都不會比這個值更大// 因此可以順利找到數組元素中的最小值return INT_MAX;}
};// 求和策略類以實現求和算法
struct SumPolicy
{// 靜態成員函數模板template<typename sumT,typename T> // sumT是和值類型,T是數組元素類型static void algorithm(sumT& sum, const T& value) // 該策略類的核心算法{sum += value;}
};template<typename T,typename U = SumFixedTraits<T>,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
{template<typename minT,typename T>static void algorithm(minT& min, const T& value){if (min > value)min = value;}
};int main()
{int my_int_array1[] = { 10,15,20 };std::cout << funcsum<int, MinFixedTraits<int>, MinPolicy>(& my_int_array1[0], & my_int_array1[2]) << std::endl;return 0;
}

在這里插入圖片描述
運行程序,新增的代碼行結果為10,一切正常。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214689.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214689.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL使用教程

數據構成了我們日益數字化的社會基礎。想象一下&#xff0c;從移動應用和銀行系統到搜索引擎&#xff0c;再到如 ChatGPT 這樣的先進人工智能聊天機器人&#xff0c;這些工具若沒有數據支撐&#xff0c;將寸步難行。你有沒有好奇過這些海量數據都存放在哪里呢&#xff1f;答案正…

2023年團體程序設計天梯賽——總決賽題

F-L1-1 最好的文檔 有一位軟件工程師說過一句很有道理的話&#xff1a;“Good code is its own best documentation.”&#xff08;好代碼本身就是最好的文檔&#xff09;。本題就請你直接在屏幕上輸出這句話。 輸入格式&#xff1a; 本題沒有輸入。 輸出格式&#xff1a; 在一…

讀excel文件,借助openpyxl工具

讀excel文件&#xff0c;借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…

ALNS4VRPTWTF

文章概述 文章研究了城市物流背景下帶有第三方轉運設施的車輛路徑問題。與經典的車輛路徑問題不同&#xff0c;這些問題提供了將客戶需求交付給第三方轉運設施&#xff08;如城市集散中心&#xff09;的選擇&#xff0c;并收取一定的費用。為了解決這些挑戰&#xff0c;該研究…

LeetCode 279完全平方數 139單詞拆分 卡碼網 56攜帶礦石資源(多重背包) | 代碼隨想錄25期訓練營day45

動態規劃算法6 LeetCode 279 完全平方數 2023.12.11 題目鏈接代碼隨想錄講解[鏈接] int numSquares(int n) {//1確定dp數組&#xff0c;其下標表示j的完全平方數的最少數量//3初始化&#xff0c;將dp[0]初始化為0&#xff0c;用于計算&#xff0c;其他值設為INT_MAX用于遞推…

物料分類帳概覽

原文地址&#xff1a;Overview: What is SAP Material Ledger? | SAP Blogs 物料分類賬是收集物料主數據存儲在物料主數據中的物料交易數據的工具。 物料分類帳使用此數據來計算價格以評估這些物料。 物料臺賬是實際成本核算的基礎。它允許以多種貨幣對材料庫存進行評估&am…

對象的生離死別

對象的生離死別 實驗介紹 在構建一個類時&#xff0c;一般情況下需要編寫構造函數、拷貝構造函數以及析構函數&#xff0c;這將直接影響程序的運行。而初始化列表是在調用構造函數時初始化參數的方式。 一個對象從實例化到銷毀的歷程&#xff1a; 知識點 內存分區構造函數exp…

java中什么是Spring Bean?

在Spring框架中&#xff0c;一個"Bean"是指由Spring IoC容器所管理的對象。這個對象可以是Java類的實例&#xff0c;也可以是引用其他對象的引用、集合或者是簡單類型。Spring Bean是應用中由IoC容器負責創建、裝配和管理的對象。 Spring中的Bean具有以下特征&#…

地牢手冊-3d

Description 你進入了一個3D的寶藏地宮中探尋到了寶藏&#xff0c;你可以找到走出地宮的路帶出寶藏&#xff0c;或者使用爐石空手回家。 地宮由立方體單位構成&#xff0c;立方體中不定會充滿巖石。向上、下、前、后、左、右移動一個單位需要一分鐘。你不能對角線移動并且地宮…

LabVIEW開發礦井排水監控系統

LabVIEW開發礦井排水監控系統 針對礦井水害對煤礦安全生產構成的威脅&#xff0c;設計了一種基于嵌入式PLC和LabVIEW的礦井排水監控系統。該系統結合了PLC的可靠控制與單片機的應用靈活性&#xff0c;有效克服了傳統排水方法中的不足&#xff0c;如測量不準確、效率低下等問題…

react相關hooks(二)

不寫性能優化的時候 const Child (props) > {console.log(child function is recalled)// count1改變時多次執行return (<div><h1>{ props.count2}</h1></div>) } function app () {const [count1.setCount1] useState(0)const [count2.setCount…

ESP8266模塊(CH340)零基礎實戰

USB數據線連接ESP8266模塊到電腦 先按住FLASH鍵,再按一下RST鍵,然后松開 此時電腦可識別出CH340 COM接口 CH340芯片廠商網址: wch.cn 傳輸比特率9600 win11自帶驅動 下載Arduino IDE

一文了解什么是Selenium自動化測試?

一、Selenium是什么&#xff1f; 用官網的一句話來講&#xff1a;Selenium automates browsers. Thats it&#xff01;簡單來講&#xff0c;Selenium是一個用于Web應用程序自動化測試工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作瀏覽器一樣。支持的瀏…

【美賽指南】新手小白必備參賽指南

美賽指南 一、2024美賽安排二、題目類型三、選題建議四、美賽前期準備五、常用算法 一、2024美賽安排 報名截至時間&#xff1a;2024年 2月2日 00&#xff1a;00 比賽時間&#xff1a;2024年 2月2日 6&#xff1a;00- 2月6日 9&#xff1a;00 提交截至日期&#xff1a;2024年2…

嵌入式系統復習--概述

文章目錄 基本概念嵌入式系統的組成結構嵌入式操作系統嵌入式軟件開發環境硬件基礎簡介下一篇 基本概念 嵌入式計算機&#xff1a;把嵌入到對象體系中、實現對象體系智能化控制的帶有微控制器的計算機&#xff0c;稱作嵌入式計算機 嵌入式系統&#xff1a;以應用為中心&#…

harmonyOS學習筆記之@Provide裝飾器和@Consume裝飾器

Provide和Consume&#xff0c;應用于與后代組件的雙向數據同步&#xff0c;應用于狀態數據在多個層級之間傳遞的場景。不同于State/Link裝飾器修飾的 父子組件之間通過命名參數機制傳遞&#xff0c;Provide和Consume擺脫參數傳遞機制的束縛&#xff0c;實現跨層級傳遞。 其中Pr…

基于Java的招聘系統的設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…

OWASP Web 安全測試指南 WSTG

Eoin Keary的前言 軟件不安全的問題可能是我們這個時代最重要的技術挑戰。支持業務、社交網絡等的 Web 應用程序的急劇興起只會加劇建立一種強大的方法來編寫和保護我們的 Internet、Web 應用程序和數據的要求。 在開放 Web 應用程序安全項目 &#xff08;OWASP&#xff09; 中…

HarmonyOS應用開發-手寫板

這是一個基于HarmonyOS做的一個手寫板應用&#xff0c;只需要簡單的幾十行代碼&#xff0c;就可以實現如下手寫功能以及清空畫布功能。 一、先上效果圖&#xff1a; 二、上代碼 Entry Component struct Index {//手寫路徑State pathCommands: string ;build() {Column() {//…

4-二分-索引二分-搜索旋轉排序數組 II

這是索引二分的第四篇算法&#xff0c;力扣鏈接 已知存在一個按非降序排列的整數數組 nums &#xff0c;數組中的值不必互不相同。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了 旋轉 &#xff0c;使數…