5.STL源碼解析-算法、仿函數、適配器

算法

STL算法總覽
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

仿函數與適配器

C++標準模板庫(STL)是C++程序員的得力工具,提供了許多強大而高效的數據結構和算法。在STL中,仿函數(Functor)和適配器(Adapter)是兩個重要的概念,它們提供了一種更靈活的方式來操作和定制算法的行為。本文將深入探討STL中的仿函數和適配器,展示它們的用法和優勢。

仿函數(Functor)

什么是仿函數?

仿函數是一種類或對象,可以像函數一樣被調用。在STL中,仿函數廣泛用于算法和容器中,允許我們以一種類似函數的方式進行操作。仿函數的關鍵特點是它實現了函數調用運算符 operator()

仿函數的分類

STL中的仿函數分為幾類:

  1. 函數對象: 定義了 operator() 的類,用于實現自定義的操作。
  2. 內建函數對象:<functional> 頭文件中定義了一些內建的函數對象,如 std::lessstd::greater,用于比較操作。

自定義仿函數的示例

cppCopy code
#include <iostream>// 自定義仿函數
struct MyFunctor {void operator()(int x) const {std::cout << "Value: " << x << std::endl;}
};
int main() {MyFunctor functor;functor(42);  // 使用仿函數return 0;
}

適配器(Adapter)

什么是適配器?

適配器是一種用于改變或增強類或函數接口的機制。在STL中,適配器主要用于調整算法的行為或使不同類型的組件能夠協同工作。

適配器的分類

STL中的適配器包括:

  1. 迭代器適配器: 改變迭代器的行為或提供額外的功能。
  2. 函數適配器: 改變函數的行為或將一種函數類型轉換為另一種類型。
  3. **容器適配器:**容器適配器是一種特殊的適配器,它們用于提供不同接口或行為的容器。

迭代器適配器的示例

cppCopy code
#include <iostream>#include <vector>#include <algorithm>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用反向迭代器適配器std::for_each(numbers.rbegin(), numbers.rend(), [](int x) {std::cout << x << " ";});// 輸出結果:5 4 3 2 1return 0;
}

函數適配器的示例

cppCopy code
#include <iostream>#include <algorithm>#include <vector>#include <functional>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用函數適配器將less函數對象轉換為greaterstd::sort(numbers.begin(), numbers.end(), std::greater<int>());// 輸出結果:5 4 3 2 1for (int x : numbers) {std::cout << x << " ";}return 0;
}

容器適配器示例

STL中的常見容器適配器包括:

  1. stack(棧): std::stack 是基于 deque、list 或 vector 的適配器,提供了棧的功能,即后進先出(LIFO)的數據結構。

    cppCopy code
    #include <iostream>#include <stack>int main() {std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";  // 輸出結果:3 2 1myStack.pop();}return 0;
    }
  2. queue(隊列): std::queue 是基于 deque 或 list 的適配器,提供了隊列的功能,即先進先出(FIFO)的數據結構。

    cppCopy code
    #include <iostream>#include <queue>int main() {std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";  // 輸出結果:1 2 3myQueue.pop();}return 0;
    }
  3. priority_queue(優先隊列): std::priority_queue 是基于 vector 的適配器,提供了優先隊列的功能,元素按照一定的優先級排列。

    cppCopy code
    #include <iostream>#include <queue>int main() {std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(4);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";  // 輸出結果:4 3 1myPriorityQueue.pop();}return 0;
    }

這些容器適配器提供了方便的接口,使得使用者可以更容易地滿足特定數據結構的需求,而無需直接操作底層容器。容器適配器的設計符合STL的思想,提供了高度抽象和可重用的數據結構。

總結

仿函數和適配器是STL中強大而靈活的工具,它們允許我們以一種可定制的方式使用算法和容器。通過深入了解仿函數和適配器的用法,我們能夠更加高效地編寫代碼,滿足不同場景下的需求。在實際應用中,靈活使用仿函數和適配器將為我們的編程工作提供更多的選擇和便利。

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

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

相關文章

C語言文件操作(fputs() 和 puts() 有兩個小區別)

fputs() 和 puts() 有兩個小區別&#xff1a; 1.puts() 只能向標準輸出流輸出&#xff0c;而 fputs() 可以向任何流輸出。 2.使用 puts() 時&#xff0c;系統會在自動在其后添加換行符&#xff1b;而使用 fputs() 時&#xff0c;系統不會自動添加換行符。 那么這是不是意味著使…

【C++精簡版回顧】17.io流,流中提供的函數

1.流含義 2.流類 3.流對象 4.流對象的函數 舉例&#xff1a; 要求&#xff1a;數據結構中經常需要對齊輸出數據&#xff0c;應該怎么做&#xff1f; 1.頭文件 #include<iomanip> 2.創建表格頭 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 網站被黑

打開環境&#xff0c;什么都沒發現&#xff0c;使用蟻劍掃描一下&#xff0c;發現shell.php&#xff0c;打開 使用BP抓包&#xff0c;進行爆破 得到密碼&#xff1a;hack 進去得到flag

GEE高階應用python wxee——如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展分析

火災進展 wxee 是專為處理氣象數據而設計的,但它對遙感數據也很有用。在本示例中,我們將了解 wxee 如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展情況。 安裝和設定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(project=x…

每日一類:QLabel深入解析

QLabel是Qt中用于顯示文本或圖像的控件&#xff0c;屬于Qt Widgets模塊。它是展示靜態內容的理想選擇&#xff0c;支持富文本格式&#xff0c;使得文本可以包含不同的字體、顏色和鏈接。QLabel也可以用來顯示圖像&#xff0c;包括動態圖像。此外&#xff0c;它還支持文本和圖像…

【Java面試題】SpringBoot與Spring的區別

主要區別體現幾個方面&#xff1a; 1.操作簡便性 SpringBoot提供極其快速和簡化的操作&#xff0c;使得Spring開發者能更快速上手。它通過提供spring的運行配置&#xff0c;以及為通用spring項目提供許多非功能性特性&#xff0c;進一步簡化了開發過程。 2.框架擴展性 Spri…

算法學習——差分

在了解差分之前&#xff0c;我們首先需要知道前綴和的概念。 前綴和簡單介紹&#xff1a; 對于一個數組A&#xff0c;要求出A[0]~A[i]的和&#xff0c;我們通常的做法是遍歷一邊&#xff0c;加起來。但是要求m組這樣的和&#xff0c;我們就要花費O(mn)的時間復雜度。顯然不合…

【考研數學】湯家鳳1800題什么水平?

我覺得湯家鳳基礎武忠祥強化這個組合非常的不錯 湯家鳳老師的講課風格 湯家鳳老師的基礎課程是大家公認的講的詳細&#xff0c;并且非常照顧基礎不好的學生&#xff0c;會把基礎知識點掰開揉碎的講給大家聽&#xff0c;在上課過程中&#xff0c;還會把知識點寫在A4紙上&#…

試了下新型的360AI搜索

360AI搜索 試了下&#xff0c;感覺還是挺不錯的。 比如問這個問題&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 對于ERROR 1698 (28000): Access denied for user rootlocalhost的問題&#xff0c;這通常是由于MySQL密碼為…

【Javascript】設計模式之單例模式

文章目錄 1、實現單例模式2、透明的單例模式3、用代理實現單例模式4、JavaScript 中的單例模式5、惰性單例6、通用的惰性單例7、小結 定義&#xff1a; 保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點 單例模式是一種常用的模式&#xff0c;有一些對象我們往…

JavaScript 學習總結(16)—— 實用小函數總結

1.匹配正整數 // 匹配正整數 let isPositiveNum = val => {return /^[1-9]d*$/.test(val); }; console.log(isPositiveNum(9)) //true console.log(isPositiveNum(2.2)) //false 2.匹配負整數 // 匹配負整數let isNegativeNum = val => {return /^-[1-9]d*$/.test(val…

R750 install AMD MI210GPU

一、 查看服務器GPU卡信息 可以首先在服務器上check 當前GPU的詳細信息是否匹配 二、安裝 Ubuntu22.04操作系統 服務器CHECK 安裝的AMD GPU 是否被系統識別 #lspci | grep AMD 查看GPU信息 可以看到已經識別成功 三、安裝AMD GPU驅動 https://rocm.docs.amd.com/projec…

linux 根目錄下結構

/ 虛擬目錄的根的目錄&#xff0c;通常不會在這里放置文件 /bin&#xff1a;存放頻繁使用的命令,二進制文件&#xff0c;存放了很多用戶級的GNU實用工具。 /boot&#xff1a;引導目錄&#xff0c;存放引導文件&#xff0c;包含啟動Linux所需的核心文件。 /dev&#xff1a;設…

智能駕駛規劃控制理論學習05-車輛運動學規劃案例分析

目錄 案例一——Hybrid A*&#xff08;基于正向運動學&#xff09; 1、基本思想 2、 實現流程 3、啟發函數設計 4、分析擴張&#xff08;Analytic Expansions&#xff09; 5、分級規劃&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

子矩陣的和 刷題筆記 {二維前綴和}

首先我們的目標是讓 s[i][j]表示為其左方和上方形成的矩陣所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重復了所以減去 最后加上a[i][j]即可完成目標 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看題目要求 要求x1,y1,x2,y2圍成的小正方形內的元素和…

C/C++工程師面試題(數據庫篇)

索引的優缺點 索引是一種支持快速查找特定行的數據結構&#xff0c;如果沒有索引&#xff0c;就需要遍歷整個表進行查找。用于提高數據檢索的速度和效率。 好處&#xff1a; 提高檢索速度&#xff1a; 索引可以加快數據的檢索速度&#xff0c;因為它們允許數據庫系統直接定位到…

Revit-二開之立面視圖創建FilledRegion-(3)

在上一篇博客中介紹了FilledRegion的創建方法,這種方法通常只在平面視圖中適用,在三維視圖中也是無法創建的(目前研究的是這樣的,如果有其他方法,請賜教)。 本片文章介紹一個下在立面視圖中創建FilledRegion的方法,主要操作是在立面視圖中拾取一個點,然后以該點為原點,…

YOLOv5 項目:推理代碼和參數詳細介紹(detect)

1、前言 本章將介紹yolov5項目的推理函數&#xff0c;關于yolov5的下載和配置環境&#xff0c;參考上一篇文章&#xff1a; YOLOv5 項目&#xff1a;環境配置-CSDN博客 pycharm 中打開的推理模塊如紅框中所示 pycharm將conda新建的虛擬環境導入&#xff0c;參考 &#xff1a;…

快速模冪(c++題解)

題目描述 試求ab%n的值&#xff0c;其中a、b、n均為整數范圍內的數。 輸入格式 三個整數即a、b、n。 輸出格式 輸出結果。 樣例 樣例輸入 復制1 1 1樣例輸出 復制0 _____________________________________________________________________________ ok呀總算學到一個…

從 AI 的爆火聊聊用戶界面(UI)的演進

目錄 用戶界面的起源與發展 用戶界面的設計原則與趨勢 用戶界面未來的方向 小結 用戶界面&#xff08;User Interface&#xff0c;簡稱 UI&#xff09;是人與計算機系統交互的媒介&#xff0c;用戶可以通過用戶界面向計算機發送指令&#xff0c;同時計算機可以通過用戶界面…