C++ 回顧

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. 類型兼容性原則

是多態(tài)性的重要基礎(chǔ)之一


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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市速蕊,隨后出現(xiàn)的幾起案子嫂丙,更是在濱河造成了極大的恐慌,老刑警劉巖互例,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢入,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡媳叨,警方通過查閱死者的電腦和手機(jī)腥光,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糊秆,“玉大人武福,你說我怎么就攤上這事《环” “怎么了捉片?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汞舱。 經(jīng)常有香客問我伍纫,道長(zhǎng),這世上最難降的妖魔是什么昂芜? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任莹规,我火速辦了婚禮,結(jié)果婚禮上泌神,老公的妹妹穿的比我還像新娘良漱。我一直安慰自己,他們只是感情好欢际,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布母市。 她就那樣靜靜地躺著,像睡著了一般损趋。 火紅的嫁衣襯著肌膚如雪患久。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天浑槽,我揣著相機(jī)與錄音墙杯,去河邊找鬼。 笑死括荡,一個(gè)胖子當(dāng)著我的面吹牛高镐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畸冲,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼嫉髓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了邑闲?” 一聲冷哼從身側(cè)響起算行,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苫耸,沒想到半個(gè)月后州邢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褪子,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年量淌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骗村。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀枢,死狀恐怖胚股,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裙秋,我是刑警寧澤琅拌,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站摘刑,受9級(jí)特大地震影響进宝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枷恕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一党晋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧活尊,春花似錦隶校、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铜犬,卻和暖如春舞终,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背癣猾。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工敛劝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纷宇。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓夸盟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親像捶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子上陕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 1.面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的方法封裝形成一個(gè)個(gè)的對(duì)象拓春。 2.什么是類释簿?...
    少帥yangjie閱讀 4,992評(píng)論 0 14
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識(shí)點(diǎn)硼莽;socket庶溶;unix;stl;boost等偏螺; C++ 教程 | 菜...
    kakukeme閱讀 19,823評(píng)論 0 50
  • c++:更好的c,c的超集 c++基本知識(shí)cin,cout命令空間引用:別名 T&x=p 高級(jí)函數(shù)的特性 內(nèi)聯(lián)函數(shù)...
    帥碧閱讀 375評(píng)論 0 1
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束行疏,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,764評(píng)論 0 3