C++對(duì)C的加強(qiáng)
0.?面向過程–>函數(shù)+面向?qū)ο蟥C>類和對(duì)象
1.namespace命名空間
2.實(shí)用性 增加 ?-- ?整型變量用時(shí)再聲明
3.Register關(guān)鍵字增強(qiáng) ?-- ?register int a = 0
<1> register關(guān)鍵字請(qǐng)求 編譯器 將局部變量存儲(chǔ)于寄存器中
<2> C語言中無法獲得register變量地址
? ? ? ? ?C++中可以取得register變量地址
<3> C++編譯器有自己的優(yōu)化方式深碱,不使用register也可能做優(yōu)化蔗喂。
4.變量檢測(cè)增強(qiáng)(全局變量) ?-- ?C++編譯器增加__重定義__檢測(cè)
5.struct類型增強(qiáng)(定義時(shí)不用+struct關(guān)鍵字) ?-- ?與class關(guān)鍵字 功能一樣
6.C++中所有的變量和函數(shù)都必須有類型 ?-- ?各種奇怪
7.新增bool類型關(guān)鍵字
8.三目運(yùn)算符功能增強(qiáng) ?-- ?(a> b ? a : b) = 30; // ?當(dāng)左值要有內(nèi)存空間
? ? ?C語言中表達(dá)式的結(jié)果放在寄存器中
? ? ?<1> C中享甸,表達(dá)式的返回 是變量的值戳气。
? ? ? <2> C++中鳖链,表達(dá)式的返回,是變量的本身窜觉。
? ? ? ? ? ? ?*(a > b ? &a : &b)= 30// C中實(shí)現(xiàn)
9. C語言中const夏块,可以通過指針修改,所以
? ?const ?int ?a= 10;
? ?int*p = (int *)&a;
? ?*p = 20;
C++const符號(hào)表實(shí)現(xiàn)原理: 符號(hào)表 – Key:Value:
? ? ?p = (int *)&a ?-- ?會(huì)新開辟內(nèi)存供p指向(編譯時(shí)分配)
給const分配內(nèi)存:
? ?<1> 對(duì)常量取地址的時(shí)候 ?-- ?&a
? ?<2> 作為全局變量的時(shí)候
10. const 和 #define ?-- ?C++中
類似:
const ?int ?a = 5;
#define ?a ?5;
不同:
<1> const常量是 由編譯器處理的扬舒,提供類型檢查和作用域檢查(同一函數(shù))阐肤。
<2>宏定義 由預(yù)處理器處理,單純的文本替換讲坎。(跨函數(shù))
#define -- #undef控制作用域孕惜,const自己控制。
引用
<1>?(變量是內(nèi)存標(biāo)號(hào)衣赶,引用是已定義變量的別名) ? – ?int &b = a;
<2> 普通引用必須要初始化+引用做函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化
本質(zhì):
<1>?&a 和 &b相同 ?== a和b是同一塊內(nèi)存空間的標(biāo)號(hào)
<2>引用的本質(zhì)是 ?常量指針 ?-- ?C++編譯器幫我們建立的關(guān)聯(lián)(取地址诊赊,加*號(hào))
<3>?因?yàn)?b>棧對(duì)象在退出函數(shù)時(shí)候被銷毀,所以不能用來賦值給引用 – int &a3 = getAA2();
但是int a2 = getAA2();可以
<4> 函數(shù)做左值
Tips:
在C中府瞄,左值指的是能夠出現(xiàn)在等號(hào)左邊及右邊的變量(表達(dá)式)碧磅,右值則指的是只能出現(xiàn)在等號(hào)右邊的變量(表達(dá)式).
返回變量的本身 ?== ?返回變量所標(biāo)識(shí)的內(nèi)存空間
二級(jí)指針:
普通變量取地址 ?--- ?一級(jí)指針
一級(jí)指針取地址 ?--- ?二級(jí)指針
同理碘箍,獲得變量地址,通過指針修改其值鲸郊。
獲得一級(jí)指針地址丰榴,通過二級(jí)指針修改其值。
1.?指針的引用: -- *&t
2. 常量引用 ?-- ?const int &y = x ?// 讓變量引用只讀屬性秆撮,不能通過y修改x
<1> 初始化:
引用:
3.C++對(duì)C的函數(shù)擴(kuò)展:
<1> inline函數(shù)
定義在類內(nèi)部的成員函數(shù)時(shí)自動(dòng)inline的
宏定義 和 函數(shù)調(diào)用: --- ?宏定義是直接替換
3.5?
4.?函數(shù)重載:overload
<1> 判斷標(biāo)準(zhǔn):
? ? 名稱四濒、參數(shù)、返回值
? ? 名稱相同职辨,參數(shù)不同(個(gè)數(shù)/類型)
<2>重載函數(shù)在本質(zhì)上是相互獨(dú)立的不同函數(shù) (靜態(tài)鏈編)
<3>返回值 不是 判斷函數(shù)重載的標(biāo)準(zhǔn)5馏 !舒裤!
5.?函數(shù)指針:
6.?面向?qū)ο?/b>:
Tips: 用struct定義的類喳资,默認(rèn)屬性是public,class默認(rèn)是private
#pragmaonce ?VS ? #ifndef ~~ #define ~~ #endif
1.?構(gòu)造函數(shù)?和?析構(gòu)函數(shù) – 沒有返回值腾供,類同名仆邓,可帶參數(shù)(析構(gòu)沒有)
(C++11:Test() = default)
<2.5> 默認(rèn)構(gòu)造
? ?默認(rèn)無參構(gòu)造函數(shù)
? ?默認(rèn)copy構(gòu)造函數(shù)(簡(jiǎn)單的進(jìn)行成員變量的值復(fù)制)
<3>構(gòu)造函數(shù)調(diào)用規(guī)則
當(dāng)類中定義了拷貝構(gòu)造函數(shù)時(shí),C++編譯器不會(huì)提供無參數(shù)構(gòu)造函數(shù)
當(dāng)類中定義了有參數(shù)構(gòu)造函數(shù)時(shí)伴鳖,~
在定義類時(shí)节值,只要寫了構(gòu)造函數(shù),必須要用榜聂。
2.深淺拷貝
(1) 淺拷貝:先釋放obj2搞疗,堆中內(nèi)存空間被釋放,再次釋放obj1的時(shí)候峻汉,p是野指針贴汪。
(2) 等號(hào)操作符 也是 淺拷貝 ?--- ?兩次泄漏
? t3有自己的指針p脐往,當(dāng)被=淺拷貝之后休吠,p指向和t1的p同一塊內(nèi)存空間,原來的內(nèi)存空間沒釋放业簿,發(fā)生泄漏瘤礁。而且,t3先釋放p梅尤,t1的p成為野指針柜思。
3.?構(gòu)造函數(shù)的初始化列表: ?-- ?在B類中 組合了一個(gè)A類對(duì)象
(1)?新的語法 Constructor::Constructor():m1(v1), m2(v1, v2), m3(v3)
? ?const必須使用列表初始化
(2)?執(zhí)行順序
<1> 先執(zhí)行 被組合對(duì)象的構(gòu)造函數(shù)
<2> 組合對(duì)象有多個(gè),按照定義順序
<3> 析構(gòu)函數(shù) 與 構(gòu)造函數(shù) 順序相反巷燥。
Tips: <1> Test(1, 2, 3) ?// ?匿名對(duì)象赡盘,沒有人接,構(gòu)造完直接析構(gòu)
<2>
4. new?+ delete (操作符) (調(diào)用構(gòu)造和析構(gòu)) --- malloc + free (C函數(shù))
<1> 基礎(chǔ)類型缰揪,數(shù)組陨享,類
<2> 三種類型,交叉使用
explicit:只能在聲明中,阻止一個(gè)實(shí)參的構(gòu)造函數(shù)抛姑,執(zhí)行隱式轉(zhuǎn)換赞厕。
C++11委托構(gòu)造函數(shù):
5.?static變量和函數(shù)屬于類
<1> 靜態(tài)成員變量: ?-- ?提供了一個(gè)同類對(duì)象的共享機(jī)制
<2> 靜態(tài)成員函數(shù):
6.
C++編譯器如何管理類,對(duì)象定硝,類和對(duì)象之間的關(guān)系
用 this 指針區(qū)分具體對(duì)象
<1>?C++只是基于C語言做了一層面向?qū)ο蟮姆庋b皿桑。
<2>?C++中類的普通成員函數(shù)都__隱式包含__一個(gè)指向當(dāng)前對(duì)象的this指針。
靜態(tài)成員函數(shù)不包含this指針蔬啡。
1. Const修飾: --- ?const修飾的是 this 指針 所指向的內(nèi)存空間诲侮,修飾的是this指針。
this原本是一個(gè)常量指針:Test *const this;
常量成員函數(shù)(只讀) ==(this->a || this->b不能修改)
PS:編譯器分兩步處理類:首先編譯成員的聲明箱蟆,然后才輪到成員函數(shù)體浆西。因此,成員函數(shù)體可以隨意使用類中的其他成員而無須在意這些成員出現(xiàn)的次序顽腾。
1.5
返回自身Test&近零,鏈?zhǔn)骄幊?/p>
3. <1> 友元函數(shù):--- 頭文件應(yīng)該為函數(shù) 提供獨(dú)立的聲明(除了類內(nèi)部的友元聲明之外)
友元函數(shù)通過對(duì)象參數(shù) 訪問私有數(shù)據(jù)成員
令成員函數(shù)作為友元
<2> 友元類:
如果B類是A類的friend(在A類聲明),B類可以訪問A類所有private
為什么設(shè)計(jì)友元類函數(shù):
<1> 1.java ?--- ?1.class(字節(jié)碼)==》 反射機(jī)制分析1.class找到類對(duì)象抄肖。直接修改類的私有屬性久信。
<2> 1.cpp ?--- ?匯編,找類就非常難
PS:類中持有 其它類對(duì)象 漓摩,要注意H故俊!管毙!要么使用 構(gòu)造函數(shù)的初始化列表腿椎,要么設(shè)置默認(rèn)參數(shù)。
4.?運(yùn)算符重載
全局函數(shù) 和 成員函數(shù) 的區(qū)別:相差一個(gè)this指針
(1)?友元函數(shù) 和 成員函數(shù)重載操作符+
(2) 前后置++ --
//后置–先保存夭咬,再++
(3) 左移右移<< >>屬于cout啃炸,所以只能用友元函數(shù)
函數(shù)返回值當(dāng)左值需返回引用
友元函數(shù)重載 常用于 運(yùn)算符的左右操作數(shù)類型不同(除外= () [] ->)
(4) 等號(hào)=操作符
先釋放舊內(nèi)存 + 返回引用
(5) == ?!=
(6) 中括號(hào)[] ?--- ?函數(shù)返回值當(dāng)左值,需要返回一個(gè)引用
這里必須返回引用卓舵,因?yàn)橛锌赡墚?dāng)左值和右值
(7) 小括號(hào)()
(8) && 與 || 可以實(shí)現(xiàn)運(yùn)算符重載南用,但是無法實(shí)現(xiàn)短路規(guī)則
默認(rèn)參數(shù) 只在 頭文件中定義
1.?繼承:
抽象,封裝掏湾,繼承裹虫,多態(tài)
<1> Public:類內(nèi)和類外
<2> Protected:類內(nèi)和子類內(nèi)部
<3>Private:類內(nèi)部
(1)`訪問調(diào)用語句`在類內(nèi)?OR?類外
(2)繼承 限制 ppp
(3)父類中的限制 ppp
2. 類型兼容性原則
3.?繼承中的構(gòu)造和析構(gòu):
Tips:class中默認(rèn)是private
4.?多繼承:
<1>?二義性:一(屬性b) ?--- ? 二(兩份屬性b) ?--- ?一(屬性b有二義性)
<2>?Virtual -?虛繼承 ?--- ?加virtual,類多4個(gè)字節(jié)
根父類構(gòu)造函數(shù)只執(zhí)行一次
<3>二 ?--- ?一 解決不了
5.?多態(tài)(一種調(diào)用語句融击,有多種表現(xiàn)形態(tài)): ?--- ?指針筑公,引用,函數(shù)調(diào)用
事先定義的框架尊浪,后來者遵循規(guī)范匣屡,所以框架可以調(diào)用未來的代碼I尽!耸采!
<1>繼承 ?<2> virtual函數(shù)重寫 ?<3> 父類指針(引用)指向子類對(duì)象
多態(tài)是設(shè)計(jì)模式的基礎(chǔ)兴泥,是框架的基礎(chǔ)。
6. ?靜態(tài)聯(lián)編 ?-- ?是程序的匹配虾宇,連接在編譯階段實(shí)現(xiàn)搓彻。重載函數(shù)
動(dòng)態(tài)聯(lián)編(遲綁定) ?-- ?程序聯(lián)編推遲到運(yùn)行時(shí)。Switch和if
7.?虛析構(gòu)函數(shù):
基類指針釋放 子類對(duì)象
父類指針釋放 所有子類資源嘱朽,執(zhí)行所有子類的析構(gòu)函數(shù)旭贬。
8.?重寫, 重載搪泳, 重定義:
Tips:子類無法重載父類的函數(shù)稀轨,父類同名函數(shù)將被名稱覆蓋,與參數(shù)無關(guān)岸军。
1.?多態(tài)的實(shí)現(xiàn)原理:
(1)當(dāng)類中聲明虛函數(shù)時(shí)奋刽,編譯器會(huì)在類中生成一個(gè)虛函數(shù)表
(2)虛函數(shù)表是一個(gè)存儲(chǔ)類成員函數(shù)指針的數(shù)據(jù)結(jié)構(gòu)
(3)虛函數(shù)表由編譯器自動(dòng)生成與維護(hù)的
(4)Virtual成員函數(shù)會(huì)被編譯器放入虛函數(shù)表中
(5)存在虛函數(shù)時(shí),每個(gè)對(duì)象中都有一個(gè)指向虛函數(shù)表的指針(vptr指針)
編譯器確定 func 是否為虛函數(shù):
(1)func不是虛函數(shù)艰赞,編譯器可直接確定被調(diào)用的成員函數(shù)(靜態(tài)鏈編佣谐,根據(jù)類 類型來確定)
(2)func是虛函數(shù),編譯器根據(jù) 對(duì)象p的 Vptr指針方妖,所指的虛函數(shù)的表中查找func函數(shù)狭魂,并調(diào)用(查找和調(diào)用在運(yùn)行時(shí)完成, 所謂的動(dòng)態(tài)鏈編)
原理:C++編譯器提前布局党觅,在類對(duì)象中增加vptr指針雌澄、虛函數(shù)入口地址存虛函數(shù)表
C++編譯器并不是區(qū)分子類對(duì)象和父類對(duì)象,而是根據(jù)對(duì)象指針杯瞻、找vptr指針镐牺,再找虛函數(shù)入口,實(shí)現(xiàn)遲綁定又兵,支持了多態(tài)任柜。
2.
(1)函數(shù):含有 純虛函數(shù)的類 叫?抽象類 ?== ?接口的封裝和設(shè)計(jì)卒废,軟件模塊功能劃分
<1> 抽象類不能建立對(duì)象沛厨,不能當(dāng)返回類型,參數(shù)類型 ?<2> 可定義指針和引用
(2)抽象類在多繼承中的應(yīng)用: ?--- ?面向接口的編程 - 多繼承抽象類
面向抽象類編程:本質(zhì)是多態(tài)摔认,只不過父類是抽象類
3. 面向?qū)ο螅?/p>
繼承 ?–- ?組合 ?-- ?功能增強(qiáng)
注入: 添加 引用…
控制反轉(zhuǎn):本來你去調(diào)用框架逆皮,框架反過來調(diào)用你
MVC
AOP:對(duì)繼承思想有利的補(bǔ)充
1. 數(shù)組類型_指針 和 函數(shù)類型_指針
2. 函數(shù)指針 做 函數(shù)參數(shù) ?---- ?任務(wù)的調(diào)用 和 任務(wù)的實(shí)現(xiàn)可以分開解耦合 – 多態(tài)
函數(shù)指針類型:把函數(shù)的參數(shù),函數(shù)的返回值提前約定
3. 正向調(diào)用参袱,load DLL到內(nèi)存电谣,拿到函數(shù)入口地址秽梅,調(diào)用。
C++進(jìn)階:
1. 泛型編程:
(1)函數(shù)模板 和 類模板
<1> 函數(shù)模板:template <typename T>
<2>
普通函數(shù) 的調(diào)用:可以進(jìn)行隱式的類型轉(zhuǎn)換
模板函數(shù) 的函數(shù)調(diào)用(本質(zhì):類型參數(shù)化):將嚴(yán)格的按照類型進(jìn)行匹配剿牺,不會(huì)進(jìn)行自動(dòng)類型轉(zhuǎn)換企垦。
<2.5>
a) 函數(shù)模板可以像普通函數(shù)一樣被重載
b) C++編譯器優(yōu)先考慮普通函數(shù)
c) 如果函數(shù)模板可以產(chǎn)生一個(gè)更好的匹配,那么選擇模板
d) 可以通過 空模板實(shí)參列表<>的語法限定 編譯器只通過模板匹配
<3> C++編譯器模板機(jī)制剖析
a)編譯器并不是把 函數(shù)模板 處理成能夠處理任意類的函數(shù)
b)編譯器從函數(shù)模板通過具體類型產(chǎn)生不同的函數(shù)
c)編譯器會(huì)對(duì)函數(shù)模板進(jìn)行兩次編譯
? ?在聲明的地方對(duì)模板代碼本身進(jìn)行(簡(jiǎn)易的)編譯晒来;在調(diào)用的地方對(duì)參數(shù)替換后的代碼進(jìn)行編譯钞诡。
函數(shù)模板產(chǎn)生的 模板函數(shù)
(2)類模板:- 數(shù)據(jù)類型 和 算法的分離
<1> 模板類是抽象的,需要進(jìn)行類型具體
<2> 類模板 做 函數(shù)參數(shù) ?--- ?A &a
<3> 繼承中的類模板
1)派生普通類
--- ?模板類派生類時(shí)湃崩,需要具體化模板類(:public A)荧降,C++編譯器需要知道 父類的數(shù)據(jù)類型。父類所占內(nèi)存大小攒读,數(shù)據(jù)類型固定朵诫,才知道如何分配內(nèi)存。
子類初始化列表
2)派生模板類
2. <1>所有函數(shù)都寫在類的內(nèi)部:
<< >>用友元函數(shù)薄扁,其他操作符重載用成員函數(shù)
<2> 所有函數(shù)都寫在類的外部:
i.
ii. 友元函數(shù)重載(<< >>)寫在類外部會(huì)出問題:
本質(zhì)是:模板是兩次編譯生成的第一次生成的函數(shù)頭 和 第二次生成函數(shù)頭 不一樣剪返。
iii. 濫用友元函數(shù)
友元函數(shù)只用來重載左移右移,其他不用邓梅。除非加類和函數(shù)的前置聲明….
<3> .h和.cpp分離:
i. main函數(shù)要引入”.cpp”文件
ii. 濫用友元函數(shù)方法失效随夸。
3. 類模板 與 static關(guān)鍵字:
i. 語法
ii. 每種數(shù)據(jù)類型(int, float)使用自己的static
4.?數(shù)組模板類 案例 ?-- ?數(shù)據(jù)類型和算法的分離
理論提高:所有容器提供的都是值,不是引用震放。容器執(zhí)行插入元素的操作時(shí)宾毒,內(nèi)部實(shí)施拷貝動(dòng)作。所以STL容器內(nèi)存儲(chǔ)的元素必須能夠被copy(必須提供拷貝構(gòu)造函數(shù))
如果加入模板類的Teacher類中有指針:
<1>重寫拷貝構(gòu)造函數(shù)
<2>重載等號(hào)操作符
<3>重載左移操作符
1. 類型轉(zhuǎn)換
<1> static_cast 靜態(tài)類型轉(zhuǎn)換 int -> char ?// ?編譯時(shí)C++編譯器會(huì)做類型檢查
C語言中殿遂,隱式類型轉(zhuǎn)換的地方诈铛,可使用 static_case<>() 進(jìn)行類型轉(zhuǎn)換
<2> reinterpreter_cast 重新解釋類型
<3> dynamic_cast 動(dòng)態(tài)類型轉(zhuǎn)換,子類和父類之間的多態(tài)類型轉(zhuǎn)換
//?運(yùn)行時(shí)類型識(shí)別RIIT
<4> const_cast 去 const 屬性 ?// ?確保指向內(nèi)存可修改
TYPE B = static_cast(B)
2. <1> 異常 ?-- ?throw x; ?-- ?異常的引發(fā)和處理不必在一個(gè)函數(shù)中
基本語法
發(fā)生異常之后墨礁,是跨函數(shù)
接受異常以后幢竹,可以不處理,再拋出
Catch異常時(shí)恩静,按照類型進(jìn)行catch
異常捕獲嚴(yán)格按照類型匹配
<2> 棧解旋(unwinding)
在try{}中焕毫,throw出異常時(shí),能釋放函數(shù)所有的棧變量
<3> 異常接口聲明:
void ?func() throw(int, char)
throw –任何
throw() –不拋出
<4>拋(intchar *類對(duì)象 引用 指針) 異常
如果接受異常的時(shí)候驶乾,使用一個(gè)對(duì)象邑飒,則進(jìn)行拷貝構(gòu)造
使用引用的話,會(huì)使用throw時(shí)的對(duì)象级乐,沒有拷貝構(gòu)造
指針可以和引用疙咸、對(duì)象寫在一起,對(duì)象和引用不能寫一起
類對(duì)象风科,使用引用
3. 流類庫 ?-- ?分3類:鍵盤撒轮,文件乞旦,內(nèi)存的輸入輸出
<1> 輸入(從緩沖區(qū)讀) ?+ ?輸出緩沖區(qū)
4. 文件io流 ?-- ?相對(duì)于應(yīng)用程序的輸出(寫文件ofstream)+ 輸入(讀文件ifstream)
文本 ?二進(jìn)制 ?打開關(guān)閉輸入輸出追加
STL標(biāo)準(zhǔn)模板庫?– Standard Template Library
數(shù)據(jù)結(jié)構(gòu)和 算法 的分離
算法, 容器题山, 迭代器
1.?容器
<1>string ?– ?封裝char*
初始化兰粉,遍歷,字符指針和string的轉(zhuǎn)換顶瞳,連接亲桦,查找和替換,截?cái)?區(qū)間刪除)和插入
翻轉(zhuǎn)和大小寫轉(zhuǎn)換
<2> vector<> ?-- ?動(dòng)態(tài)數(shù)組
front() ?back() ?push/popback() ?– ?尾部插入刪除快
<3> 迭代器
erase() 會(huì)讓it自動(dòng)下移
it = v.erase(it)
<4> deque ?-- ?雙端數(shù)組
push_front() ?pop_front()
push_back() ?pop_back()
<5> queue
<6> stack
<7> list雙向鏈表
i. 不支持隨機(jī)存取(不可以it + 5,可++--)浊仆,不支持at()和[]
ii. insert()是插入到指針當(dāng)前位置
<8> priority_queue<>默認(rèn)最大值優(yōu)先級(jí)隊(duì)列
priority_queue< greater<int> >
<9> Set/multiSet元素唯一客峭,自動(dòng)排序(小到大),采用紅黑樹變體的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)抡柿,屬于平衡二叉樹舔琅。
自定義數(shù)據(jù)類型排序(仿函數(shù)應(yīng)用)
<10> Map/multiMap
插入 ?— ?4種方法 – 結(jié)果檢查pair刪除遍歷.
find() –返回迭代器
1.5 容器的值拷貝:
無參,有參洲劣,拷貝構(gòu)造备蚓,析構(gòu),重載=號(hào)
1.9 容器使用時(shí)機(jī)
2. STL算法中函數(shù)對(duì)象和謂詞
(1)函數(shù)對(duì)象(重載函數(shù)調(diào)用操作符()的類囱稽,其對(duì)象稱為函數(shù)對(duì)象)和 謂詞
a) 函數(shù)對(duì)象做參數(shù) 和 返回值 ?--- ?t1=for_each(v.begin(), v.end(), t1);
b) 函數(shù)對(duì)象 與 普通函數(shù): 調(diào)用相似郊尝,函數(shù)對(duì)象是類對(duì)象能保持調(diào)用的狀態(tài)
(2)一元(參數(shù))函數(shù)對(duì)象 一元(參數(shù))謂詞 –(返回值bool,可以是一個(gè)仿函數(shù)或者回調(diào)函數(shù))
find_if()
(3)二元對(duì)象 和 二元謂詞
transform(v1.begin,v1.end,v2.begin,v3.begin,fun)
sort(begin,end,fun)
(4) 二元謂詞在set中的應(yīng)用
(5) 預(yù)定義函數(shù)對(duì)象 ?--- ?算術(shù)战惊,關(guān)系流昏,邏輯
(6) 函數(shù)適配器
isGreater() ?count() ?bind2nd() ?not1
3. STL容器算法 迭代器的設(shè)計(jì)理念
1)STL容器通過類模板技術(shù),實(shí)現(xiàn)數(shù)據(jù)類型和容器模型的分離
2)STL的迭代器技術(shù)實(shí)現(xiàn)了遍歷容器的統(tǒng)一方法吞获;也為STL的算法提供了統(tǒng)一性奠定了基礎(chǔ)
3)STL的算法况凉,通過函數(shù)對(duì)象實(shí)現(xiàn)了自定義數(shù)據(jù)類型的算法運(yùn)算;所以STL的算法也提供了統(tǒng)一性
核心思想:其實(shí)函數(shù)對(duì)象本質(zhì)就是回調(diào)函數(shù)各拷,回調(diào)函數(shù)的思想:就是任務(wù)的編寫者和任務(wù)的調(diào)用者有效解耦合(函數(shù)指針做函數(shù)參數(shù))
具體例子:transform算法的輸入刁绒,通過迭代器first和last指向的元素作為輸入,通過result作為輸出烤黍,通過函數(shù)對(duì)象來做自定義數(shù)據(jù)類型的運(yùn)算
4. STL算法分類:
for_each ?V ?Stransform ?-- ?如果目標(biāo)和源相同知市,他們基本相同
for_each 速度快不靈活
transform 速度慢非常靈活
transform對(duì)函數(shù)對(duì)象的要求:有返回值
查找
adjacent_find() ?– ?查找一對(duì)相鄰重復(fù)元素 的 第一個(gè)
distance()
binary_search() ?-- ?二分法查找
count() ?count_if()
find() ?find_if()
排序
merge()
sort()
random_shuffle()
reverse()
拷貝和替換
copy()
replace() ?replace_if()
swap()
算術(shù)
accumulate()
fill()
集合算法
set_union( ?)set_intersection() ?set_difference()