C/C++復習(四)

一.模版

模版涉及的是泛型編程,即通過編譯器去確定類型的編程方式,模版分為:類模板和函數模版,下面我們一一復習:

函數模版:

格式:

template<typename T1, typename T2,......,typename Tn>
返回值類型 函數名(參數列表){}
//注意:typename是用來定義模板參數關鍵字,也可以使用class(切記:不能使用struct代替class)//模版既可以為typename,也可以為size_t

對于函數模版,原理就是通過編譯器在編譯時通過傳入的實參來推導形參對應的類型,然后產生專門對應的類型代碼,如下:

//模版:
template<class T>
void swap(T& a,T& b)
{T c=a;a=b;b=c;
}int main()
{//調用:int a=10,b=20;swap(a,b);//會去生成下面內容->最后面    return 0;
}//生成的代碼:
void swap(int a,int b)
{int c=a;a=b;b=c;
}

函數模版的實例化分為顯示實例化和隱式實例化,上面由編譯器推導的都是隱式實例化,顯示實例化是指調用時,由用戶指定類型,從而直接傳遞類型,如下:

//直接寫調用,還是swapint main()
{double d1=1.2;double d2=2.5;swap<double>(d1,d2);return 0;
}//注意點:
//如果類型不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器將會報錯

類模板:

格式:

template<class T1, class T2, ..., class Tn>
class 類模板名
{// 類內成員定義
};

類模版大體與函數模版相似使用即可,不同的是類模板實例化必須在類模板名字后跟<>,然后將實例化的類型放在<>,類模板名字不是真正的類,而實例化的結果才是真正的類

然后就是大家還可以去復習下全特化與偏特化內容,然后還有模版最好不要分離編譯,使用.hpp,大家可以參考下面博客復習:

C++之模版詳解-CSDN博客



二.容器常見知識點

1.vector與list區別?

1.底層實現上:
vector底層是一段連續的順序表,而list是帶頭結點的雙向循環鏈表,底層不連續
2.訪問上:
vector由于其底層連續,可以支持下標隨機訪問,list不支持隨機訪問,必須要遍歷查找
3.操作上:
插入:vector任意位置插入由于可能需要挪動空間、開辟新空間,整體拷貝效率非常低下,list插入只需要改變指針指向和開辟一個節點空間即可,效率高
刪除:vector除尾刪外任意位置刪除都要挪動空間,效率低,而list不需要挪動空間,只需要改變指針指向,效率高
4.空間利用上:
vector是連續的順序表,不易造成空間碎片化,而list是通過指針將節點相連,各節點之間不連續,空間碎片化嚴重,空間利用率低
5.迭代器上:
vector是使用原生態的迭代器(即只是指針),list是將原生態迭代器進行了封裝,可以參考我的github:
https://github.com/zhutishou/C-STL-Copywriting/blob/main/list.cpp
6.使用場景上:
vector適用于高效存儲和隨機訪問上,不關系插入和刪除效率;list適用于大量插入和刪除上,不注重空間利用和隨機訪問

2.vector如何實現插入?

1.首先,先判斷插入位置是否正確
2.檢查空間是否需要擴容
3.將要插入以后的元素整體后移
4.插入當前位置
5.返回插入位置的迭代器
//具體代碼如下:
//插入:
//插入:
iterator insert(iterator pos,const T& val)
{if(pos < _begin|| pos > _end){std::cerr<<"該位置不存在"<<std::endl;}//判斷是否需要擴容:if(_end == _endofstorage){size_t len = _begin + pos;reserve(capacity()==0?4:2*capacity());pos = _begin + len;}//pos后續位置后移:iterator finish = _end -1;while(finish > pos){*(finish+1) = *finish;finish--;}*pos = val;_end++;return pos;
}
//vector實現代碼如下:
https://github.com/zhutishou/C-STL-Copywriting/blob/main/vector.cpp

3.vector和list都有缺陷,是否存在其他容器可以兼顧兩者優點呢?

能夠兼顧vector和list優點的容器就是deque(雙端隊列)
介紹:
deque是雙開口的“連續”空間的數據結構,注意:“連續”實際上是一段段小空間拼湊出來的,只是支持下標隨機訪問看做連續,支持頭插尾插,并且不需要挪動元素
相比于vector和list優點:
1.相比于vector頭插尾插O(1),不用挪動數據,并且擴容時,不需要整體拷貝
2.相比于list,空間利用率更高缺點:
不適合遍歷,由于其底層是一個個小空間實現的,迭代器需要不斷檢查邊界,效率低下,因此通常還是使用vector或list使用場景:
deque通常是stack和queue空間適配器默認的容器,原因是因為兩者都不需要遍歷,而且只在首尾操作

4.map和set底層是什么?

對于map/set和unordered_map/unordered_set這是我們必須掌握的
map/set底層是紅黑樹,unordered_map/unordered_set底層是哈希表
該問題實際上是問紅黑樹的相關信息:
一.規則:
1. 每個結點不是紅色就是黑色
2. 根節點是黑色的
3. 如果一個節點是紅色的,則它的兩個孩子結點是黑色的
4. 對于每個結點,從該結點到其所有后代葉結點的簡單路徑上,均包含相同數目的黑色結點
5. 每個葉子結點都是黑色的(此處的葉子結點指的是空結點)
紅黑樹通過規則2、3保證樹的其最長路徑中節點個數不會超過最短路徑節點個數的兩倍
效率:
紅黑樹是一個高效的平衡二叉樹,增刪查改效率都是O(LogN)
實現:
可以參考我的github注意:
multimap和multiset也是紅黑樹實現的,但是與set/map不同點在于這兩個允許出現重復的key值

5.map的operator[]是如何實現的?

V& operator[](const K& key)//V --- value 
{ return (*(_t.Insert(ValueType(key, V()))).first).second;
}operator[]如果存在key,就返回對應的value,如果不存在key,就插入key,返回默認值

6.一個什么類型才能做map和set的key值?

map和set底層都是紅黑樹,而紅黑樹是平衡搜索樹,所以一定支持比較大小,當然提供相應的仿函數來比較大小的類型也是可以的

7.unordered_map和unordered_set是如何實現的?

這個問題本質上是詢問我們其底層實現,顯然這兩者都是通過哈希實現的,那么就講述哈希特點
規則:
哈希是通過哈希函數進行相應的映射關系,使key與存儲位置建立一一的映射,在查找時就可以快速找到
對比:
哈希在查找時效率為O(1),而紅黑樹效率為O(LogN),順序表效率為O(N)
常見問題:
哈希沖突:
該問題無法避免,是指不同關鍵字通過相同哈希哈數計算出相同的哈希地址,該種現象稱為哈希沖突或哈希碰撞,解決方法:建立合適的空間大小,減少通過哈希函數計算之后碰撞的發生,還有兩種常見處理方法:開散列和閉散列

8.一個類型做unordered_map和unordered_set的key有什么要求?

哈希是需要通過哈希函數進行映射的,所以key值必須可以實現向整數的轉換,這樣才能映射到存儲空間中

最后,感謝你的支持!!!

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

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

相關文章

022 基礎 IO —— 文件

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄基礎 IO —— C 語言文件 I/O 操作基礎前言1. C 語言文件操作函數匯…

MNN LLM Chat iOS 流式輸出優化實踐

本文介紹了在 iOS 平臺上使用 MNN 框架部署大語言模型&#xff08;LLM&#xff09;時&#xff0c;針對聊天應用中文字流式輸出卡頓問題的優化實踐。通過分析模型輸出與 UI 更新不匹配、頻繁刷新導致性能瓶頸以及缺乏視覺動畫等問題&#xff0c;作者提出了一套包含智能流緩沖、U…

【開發技巧】VS2022+QT5+OpenCV4.10開發環境搭建QT Creator

VS2022編譯器支持配置 QT5默認安裝以后支持的是VS2015與VS2017&#xff0c;不支持VS2022&#xff0c;所以必須首先在Qt Creator中配置支持VS2022。配置順序如下&#xff1a; 首先打開【工具】->【選項】 然點擊Kits里面的【編譯器】選項。點擊Manual下面的【C】然后點擊【…

【Linux系統】動靜態庫的制作

前言&#xff1a; 上文我們講到了文件系統【Linux系統】詳解Ext2&#xff0c;文件系統-CSDN博客 本文我們來講講動靜態庫的制作 庫 【Linux】編譯器gcc/g及其庫的詳細介紹_linux gcc 有哪些庫-CSDN博客 這篇文章的第4大點&#xff0c;簡單是介紹了一下庫的基本概念。 靜態庫 靜…

鏈式二叉樹的基本操作——遍歷

本文筆者將帶領讀者一起學習鏈式二叉樹的一些基本語法&#xff0c;至于更難一些的插入刪除等&#xff0c;筆者將在后續C更新后再次詳細帶領大家學習。 首先&#xff0c;在進行二叉樹之前&#xff0c;我們需要一顆二叉樹&#xff0c;而二叉樹的初始化現階段實現不太現實&#x…

Windows運維之以一種訪問權限不允許的方式做了一個訪問套接字的嘗試

一、問題場景 在Windows 上運維服務過程中&#xff0c;經常會遇到運行服務&#xff0c;部署安裝時候無任何問題&#xff0c;后續再某個特殊時間點&#xff0c;突然服務無法啟動了。再次啟動時&#xff0c;提示端口占用與以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。 …

2020/12 JLPT聽力原文 問題二 3番

3番&#xff1a;レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女&#xff1a;店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男&#xff1a;ああ、サラダだけで満足できるっ…

芯片行業主要廠商

作為一個小白&#xff0c;每次淘寶買芯片時看到相似的命名規則&#xff1a;“OPA、AD、LT、MAX”等等時&#xff0c;我不禁好奇這些芯片行業大廠有哪些&#xff0c;所以查了些資料&#xff1a; 1. 德州儀器&#xff08;Texas Instruments, TI&#xff09; 公司概況&#xff1…

【BLE系列-第四篇】從零剖析L2CAP:信道、Credit流控、指令詳解

目錄 引言 一、L2CAP主要功能 二、L2CAP幀格式及信道概念 2.1 邏輯鏈路是什么&#xff1f; 2.2 邏輯信道的作用 2.3 L2CAP幀格式介紹 三、L2CAP信令信道 3.1 信令信道幀格式說明 3.2 信令信道指令介紹 3.2.1 信令信道指令一覽表 3.2.2 Credit流控規則 引言 在BLE協…

CSS保持元素寬高比,固定元素寬高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">這里是正文內容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 寬高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

數據分析小白訓練營:基于python編程語言的Numpy庫介紹(第三方庫)(上篇)

&#xff08;一&#xff09;Numpy庫的安裝安裝指定版本的Numpy庫&#xff0c;打開命令提示符&#xff0c;輸入下圖內容&#xff0c;只需要將1.25.5的版本修改成個人需要的版本&#xff0c;然后按下回車鍵&#xff0c;numpy庫就安裝在python中&#xff1a;指定版本numpy庫安裝可…

從 Windows 到 Linux 服務器的全自動部署教程(免密登錄 + 壓縮 + 上傳 + 啟動)

一、準備工作 1. 環境說明 本地開發環境&#xff1a;Windows 服務器&#xff08;需執行部署腳本&#xff09;目標服務器&#xff1a;Linux 服務器&#xff08;需安裝 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;壓縮&#xff09;、OpenSSH&#x…

智能汽車領域研發,復用云原始開發范式?

汽車電子電氣架構演進趨勢&#xff1a;分散的功能ECU -> 域控制器 -> 中央計算服務器汽車電子方案與架構在發展與迭代時會使用虛擬化方法幾種可行的軟硬一體化方案&#xff1a;多ECU&#xff0c;硬件隔離&#xff0c;硬件分區&#xff0c;車規級多核硬件架構 Hypervisor…

數據電臺詢價的詢價要求

技術規格及主要參數 1.電臺基本要求&#xff1a; 1.1 電臺中的信號處理基于FPGA設計&#xff0c;采用FPGAARM高速AD/DA設計架構&#xff1b; 1.2 具備頻譜感知、自主選頻、跳頻、擴頻等功能&#xff1b; 1.3 具備鏈路質量信息、自組網路由信息、電池電壓監測信息、北斗定位信息…

IoT/HCIP實驗-5/基于WIFI的智慧農業實驗(LwM2M/CoAP+PSK+ESP8266 連接到 IoTDA)

文章目錄概述WIFI8266 通信模組WIFI模組也用AT指令&#xff1f;ESP8266 內置協議棧?支持的無線網絡模式MCU通過串口與模組交互Wifi模組做客戶端PC-AT接入路由器向本地TCP服務發數據用代碼接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平臺側開發工程配置和編譯工程…

定時器輸出PWM波配置(呼吸燈)

使用定時器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;實現呼吸燈效果。 頻率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模塊頭文件&#xff1a;應聲明 pwm_init/pwm_compare_set 等原型、并包含 HAL 頭//&#xff08;示…

[ai-agent]環境簡介之沙盒e2b vs daytona

所謂的環境的就是agent運行在哪里&#xff0c;或者是agent和那里進行交互。 最常見的環境就是本地開發環境&#xff0c;也就是個人主機&#xff0c;但是存在問題就是沒有辦法出網和橫向擴展。 在沙盒之前也是有其他選擇的&#xff1a; 云服務器&#xff0c; 虛擬機&#xff0c;…

【前端面試題】前端面試知識點(第三十一題到第六十一題)

三十一. CSS實現垂直水平居中 實現元素的垂直水平居中是前端開發中的常見需求,主要有以下幾種思路: text-align + line-height實現單行文本水平垂直居中 適用于單行文本元素,通過text-align: center實現水平居中,line-height等于容器高度實現垂直居中 text-align + vertic…

嵌入式練習項目——————抓包獲取天氣信息

一、內容 嘗試通過實時天氣接口 - 數據接口 - NowAPI此網站獲取天氣信息&#xff0c;實現可以發送城市查詢當前天氣和未來天氣 二、獲取請求報文 可以根據測試示例看到獲取內容&#xff0c;此時數據是cJSON格式&#xff0c;我們首先要通過合適的網址抓包獲取到請求報文&#x…

Python爬蟲實戰:研究NewsCrawl ,構建新浪和網易新聞數據采集系統

1. 引言 1.1 研究背景與意義 在信息時代,新聞作為社會動態、公眾觀點的重要載體,其傳播速度與影響力持續擴大。傳統的人工篩選與采集方式已無法滿足對海量新聞數據的高效處理需求,亟需自動化工具實現大規模、結構化的新聞數據采集。網絡爬蟲技術作為一種按照預設規則自動抓…