C++STL算法庫中謂詞的使用

什么是c++的謂詞

謂詞概念:

????????謂詞函數是一個判斷式,一個返回bool值的函數或者仿函數,有幾個入參就是幾元謂詞。一般做一個函數的參數使用【引用自百度百科】。

????????常見的可以作為謂詞的東西:函數、函數指針、函數對象、lambda表達式,庫定義的函數對象。

概念消化:

????????謂詞,即謂語動詞。其實我們可能之前不了解這個概念,但是我們已經經常在使用了,最典型的例子:

使用sort算法對vector元素降序排序:

? ? ? 參3?greater<int>() 就是一個謂詞,它本質上是c++的庫函數對象。

sort(v.begin(), v.end(), greater<int>());

?順便對比回顧下 sort的算法聲明:

sort(iterator beg, iterator end, _Pred);
// 按值查找元素,找到返回指定位置迭代器,找不到返回結束迭代器位置
//  beg    開始迭代器
//  end    結束迭代器
// _Pred  謂詞

? ? ? 參3?_Pred ,就是謂詞,predicate單詞的前綴。

? ? ? ? 其實個人感覺這個名字其實起的還是挺形象的,明確表述了 謂詞 在算法語句中所起的作用,讓程序員能夠自定義算法執行時候“更具體的的動作”。

澄清一點:

????????在之前的學習過程中,發現有些博文或者教程如下定義謂詞。

  • 返回bool類型的仿函數稱為謂詞

  • 如果operator()接受一個參數,那么叫做一元謂詞

  • 如果operator()接受兩個參數,那么叫做二元謂詞

????????但是作為初學者在后續的使用過程中,發現需要傳入謂詞的地方很多時候,傳入一個函數名或者函數指針、或者一個lambda表達式照樣使用。因此,本文章稍微從廣義角度稍微矯正了個人對謂詞的理解。

STL中使用到謂詞的算法快速回顧

????????實際使用中,能感覺到,stl常用算法中大量應用了謂詞,便于程序員執行算法的時候定義“更具體的/自定義的動作”。例如:

例如:遍歷算法

//普通函數
void print01(int val) 
{cout << val << " ";
}
//函數對象
class print02 
{public:void operator()(int val) {cout << val << " ";}
};//for_each算法基本用法
void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//遍歷算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());cout << endl;
}

例如:查找算法

//內置數據類型
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "沒有找到!" << endl;}else {cout << "找到大于5的數字:" << *it << endl;}
}

例如:排序算法

sort(v.begin(), v.end(), greater<int>());

例如:拷貝替換算法

class myPrint
{
public:void operator()(int val){cout << val << " ";}
};class ReplaceGreater30
{
public:bool operator()(int val){return val >= 30;}
};void test01()
{vector<int> v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(40);v.push_back(50);//將容器中大于等于的30 替換成 3000replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);for_each(v.begin(), v.end(), myPrint());
}

針對某種算法展開舉例各種謂詞的使用

已經有很多博友在這塊寫過總結,路過的小伙伴可以直接參考:

count_if:

c++中的謂詞:函數、函數指針、函數對象(仿函數)、lambda表達式、bind2nd使用示例_c++ 定義函數做謂詞-CSDN博客

sort:

C++ - 算法(algorithm) 的 謂詞(predicate) 詳解_predicate c++-CSDN博客

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

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

相關文章

2023 年浙江省職業院校技能大賽信息安全管理與評估賽項規程

*2023 年浙江省職業院校技能大賽“高職組”* *“信息安全管理與評估”賽項規程* *一、賽項名稱* 賽項名稱&#xff1a;信息安全管理與評估 英文名稱&#xff1a;Information Security Management and Evaluation 賽項組別&#xff1a;高職 賽項歸屬產業&#xff1a;電子信…

熱電廠發電機組常見故障及預測性維護方法

熱電廠的發電機組是關鍵的能源生產設備&#xff0c;在電力供應中扮演著關鍵角色。但經過長期運行和高負荷工作&#xff0c;一旦發生故障&#xff0c;可能導致停機、設備損壞甚至引發嚴重事故。因此&#xff0c;實施有效的預測性維護方法對于確保發電機組的穩定運行至關重要。本…

Linux(17):認識與分析登錄檔

什么是登錄檔 【詳細而確實的分析以及備份系統的登錄文件】是一個系統管理員應該要進行的任務之一。 登錄檔 就是記錄系統活動信息的幾個文件&#xff0c;例如&#xff1a;何時、何地(來源IP)、何人(什么服務名稱)、做了什么動作(訊息登錄啰)。 換句話說就是&#xff1a;記錄系…

【MySQL】:表的操作

表的操作 一.創建表二.查看表結構三.修改表四.刪除表 一.創建表 field 表示列名。 datatype 表示列的類型。 character set 字符集&#xff0c;如果沒有指定字符集&#xff0c;則以所在數據庫的字符集為準。 collate 校驗規則&#xff0c;如果沒有指定校驗規則&#xff0c;則以…

MySQL系列(二)——日志篇

MySQL日志 主要包括錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志幾大類。其中&#xff0c;比較重要的還要屬二進制日志binlog&#xff08;歸檔日志&#xff09;和事務日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滾日志&#xff09;。 今…

windows批處理腳本(.bat)如何激活Anconda Prompt虛擬環境

通過call 來調用激活腳本&#xff0c; activate myenv指的是要激活的環境&#xff0c;若省略&#xff0c;則激活的是base環境。 call : 從另一個批處理程序調用一個批處理程序&#xff0c;而不停止父批處理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…

fastdds共享內存實現原理

fastdds 共享內存分兩個部分&#xff0c;一部分用于保存數據&#xff0c;一部分用于通信。 fastrtps_“UUID”:共享內存包括又兩部分數據&#xff0c;BufferNode和segment_size, 用配置文件port_queue_capacity_指定BufferNode的數量&#xff0c;segment_size用于保存實際傳輸的…

imp導入數據發現的

遷移歷史數據到歷史庫&#xff0c;因為災備數據中心使用的DG&#xff0c;無法使用數據泵&#xff0c;只能通過exp導出&#xff0c;然后再通過imp導入 為防止undo表空間壓力過大&#xff0c;在導入時imp使用了commit參數及buffer參數 這次導入數據量達到1TB&#xff0c;剛到了1/…

智物發布MT6877平臺無線AR智能眼鏡參考設計,推動下一代無線AR發展

隨著增強現實(AR)技術的不斷發展&#xff0c;有線AR眼鏡在連接和使用方面存在一些限制。為了解決這些問題&#xff0c;無線AR智能眼鏡的推出勢在必行。 新一代無線AR智能眼鏡采用了天璣900&#xff08;MT6877&#xff09;平臺作為參考設計&#xff0c;搭載了2.4GHz的八核處理器…

【rabbitMQ】Exchanges交換機

上一篇&#xff1a;springboot整合rabbitMQ模擬簡單收發消息 https://blog.csdn.net/m0_67930426/article/details/134904766 本篇代碼基于上一篇繼續寫 目錄 Fanout 交換機 1. add queue 2. add Exchange 3.綁定隊列 Direct 交換機 1. add queue 2. add Exchange 3.…

011 數據結構_哈希

前言 本文將會向你介紹哈希概念&#xff0c;哈希方法&#xff0c;如何解決哈希沖突&#xff0c;以及閉散列與開散列的模擬實現 1. 哈希概念 順序結構以及平衡樹中&#xff0c;元素關鍵碼與其存儲位置之間沒有對應的關系&#xff0c;因此在查找一個元素時&#xff0c;必須要經…

CyclicBarrier、CountDownLatch、Semaphore 的用法

CyclicBarrier、CountDownLatch、Semaphore 的用法 CountDownLatch&#xff08;線程計數器 &#xff09; CountDownLatch 類位于 java.util.concurrent 包下&#xff0c;利用它可以實現類似計數器的功能。比如有一個任務 A&#xff0c;它要等待其他 4 個任務執行完畢之后才能執…

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列 1、隊列&#xff1a;先進先出 隊列是項的有序集合&#xff0c;其中&#xff0c;添加新項的一端稱為隊尾&#xff0c;移除項的另一端稱為隊首。一個元素在從隊尾進入隊列后&#xff0c;就會一直向隊首移動&#xff0c;直到…

鴻蒙原生應用再添新丁!同花順入局鴻蒙

鴻蒙原生應用再添新丁&#xff01;同花順入局鴻蒙 來自 HarmonyOS 微博12月11日消息&#xff0c;同花順已完成#鴻蒙原生應用#beta版本&#xff0c;并正在進行全量版本開發&#xff0c;進一步豐富了#鴻蒙原生應用#的覆蓋領域。同花順作為股民和券商首選的一站式金融理財服務平臺…

擴展學習|商業智能和分析:從大數據到大影響

文獻來源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下載鏈接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取碼&#xff1a;a8uy 在不同的組…

MySQL忘記密碼

根據提供的引用內容&#xff0c;當使用root用戶登錄MySQL時&#xff0c;如果密碼錯誤&#xff0c;會出現"Access denied for user ‘root’‘localhost’ (using password: NO)"的錯誤提示。這個錯誤提示表示使用了錯誤的密碼或者沒有輸入密碼就嘗試登錄MySQL。解決這…

SQL命令---查看數據庫表

介紹 使用sql命令查看數據表。 命令 show create table 表名\G;\G&#xff1a;使顯示結果整齊美觀。

Vue-第七天

智慧商城項目&#xff1a; 1.創建項目選項&#xff1a; 2.調整&#xff1a; 主要是增加兩個文件夾&#xff0c;刪除倒是沒什么 3.組件庫&#xff08;vant-ui&#xff09;&#xff1a; 點擊進入官網:Vant 2 - Mobile UI Components built on Vue 4.導入&#xff1a; 全部導入…

MES系統需要具備哪些性能方面的需求?

MES系統需要具備哪些“性能需求”&#xff1f;關于這個問題&#xff0c;我覺得有必要先和大家解釋一下&#xff0c;到底什么是性能需求&#xff1f;性能需求在MES系統的作用是什么&#xff1f;講明白了這2點&#xff0c;問題自然而然就解決了。 什么是性能需求&#xff1f; 通…

選擇最適合您的數據集成工具

個人 對于個人而言&#xff0c;選擇最適合的數據集成工具可能會有一些不同的考量因素。以下是一些個人選擇數據集成工具時可能需要考慮的因素&#xff1a; 技術水平和經驗&#xff1a; 如果個人具有較深的技術水平和經驗&#xff0c;可能更傾向于選擇功能豐富、靈活性強的數據…