C++(2013.11.27)
1.多態(tài) : 一個(gè)switch, 一個(gè)函數(shù)指針 重載,覆蓋,隱藏
const 引用必須在初始化列表中初始化
純虛函數(shù) virtual void eat()=0
VTABLE虛函數(shù)初始化表
C++ 不允許隱式轉(zhuǎn)換
2。多態(tài)分為四類 : 參數(shù)多態(tài),包含多態(tài), 強(qiáng)制多態(tài),重載多態(tài)
3.虛函數(shù)提供了一中更為靈活的動(dòng)態(tài)性機(jī)制。虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運(yùn)行是建立(動(dòng)態(tài)聯(lián)編)
4.對(duì)虛函數(shù)的定義的幾點(diǎn)說明 :
(1)通過定義虛函數(shù)使用C++提供的多態(tài)性機(jī)制時(shí),派生類應(yīng)從其基類公有派生
(2)必須首先在基類定義為虛函數(shù)
(3)C++規(guī)定,當(dāng)一個(gè)成員函數(shù)被聲明為虛函數(shù)后,其派生類中的同名函數(shù)都自動(dòng)成為虛函數(shù)。
(4)一般是先定義基類指針,然后通過基類指針指向派生類,訪問虛函數(shù)獲取運(yùn)行時(shí)多態(tài)性
(5)虛函數(shù)必須是類的成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)成員函數(shù)
(6)內(nèi)聯(lián)函數(shù)不能是虛函數(shù),因?yàn)閮?nèi)聯(lián)函數(shù)是在編譯地確定位置,虛函數(shù)雖然定義在類內(nèi)部,但編譯時(shí)仍將其視為非內(nèi)聯(lián)
(7)構(gòu)造函數(shù)不能是虛函數(shù)。因?yàn)樘摵瘮?shù)作為運(yùn)行過程中多態(tài)的基礎(chǔ),主要是針對(duì)對(duì)象的,而構(gòu)造函數(shù)是在對(duì)象產(chǎn)生之前運(yùn)行的,因此虛構(gòu)造函數(shù)無意義。
(8)析構(gòu)函數(shù)可以是虛函數(shù)
5.編譯時(shí)的多態(tài) : 函數(shù)重載
運(yùn)行時(shí)的多態(tài) : 虛函數(shù)和繼承
6.靜態(tài)聯(lián)編 :
動(dòng)態(tài)聯(lián)編:
7.純虛函數(shù)定義 :是一個(gè)基類中說明的虛函數(shù),它在該基類中沒有定義,但要求在它的派生類中必須定義自己的版本,或重新說明為純虛函數(shù)
8.純虛函數(shù)的特點(diǎn):
(1)沒有函數(shù)體
(2)最后面“=0”并不表示函數(shù)返回值為0,它只起形式上的作用,告訴編譯系統(tǒng)“這是純虛函數(shù)”
(3)這是一個(gè)聲明語句,最后應(yīng)有分號(hào)。
9.抽象類 :不用來定義對(duì)象而只作為一種基本類型用作繼承的類,由于它常用作基類,通常稱為抽象基類
抽象類的特點(diǎn) :
(1)凡是包含純虛函數(shù)的類都是抽象類(至少一個(gè)純虛函數(shù))
(2)抽象類只能作為其他類來使用,不能建立抽象類對(duì)象。因?yàn)榧兲摵瘮?shù)是不能被調(diào)用的,包含純虛函數(shù)的類是無法建立對(duì)象的,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出
10. 重載,覆蓋,隱藏
成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual關(guān)鍵字可有可無。
覆蓋 : 派生類函數(shù)覆蓋基類函數(shù) 特征:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual關(guān)鍵字
隱藏 : 派生類函數(shù)屏蔽了與其同名的基類
11.C++核心優(yōu)勢(shì)之一便于軟件的重用
12.C++中有兩個(gè)方面體現(xiàn)重用 :
1. 面向?qū)ο蟮乃枷?:繼承,多態(tài),標(biāo)準(zhǔn)類庫
2.泛型程序設(shè)計(jì)(generic programming)的思想 :模版機(jī)制,以及標(biāo)準(zhǔn)模版庫STL
13 泛型程序設(shè)計(jì)
將一些常用的數(shù)據(jù)結(jié)構(gòu) (比如鏈表,數(shù)組,二叉樹)和算法(比如排序,查找)寫成模版,以后則不論數(shù)據(jù)結(jié)構(gòu)里放的是什么對(duì)象,算法針對(duì)什么樣的對(duì)象,則都不必重新實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),重新編寫算法
標(biāo)準(zhǔn)模版庫(Standard Template Library): 一些常用數(shù)據(jù)結(jié)構(gòu)和算法的模版的集合。由Alex Stepanov開發(fā),于1998年被添加進(jìn)C++ 標(biāo)準(zhǔn)
13. 模版分類
函數(shù)模版(function template)
是獨(dú)立于類型的函數(shù)
可產(chǎn)生函數(shù)的特定版本
類模版(class template)
跟類相關(guān)的模版, 如vector
可產(chǎn)生類對(duì)特定類型的版本, 如vector <int>
14.模版的工作方式 : 函數(shù)模版只是說明, 不能直接執(zhí)行,需要實(shí)例化為模版函數(shù)后才能執(zhí)行
15. 模版優(yōu)缺點(diǎn) :
優(yōu)點(diǎn):函數(shù)模版方法克服了C語言解決上述問題時(shí)用大量不同函數(shù)名表示相似功能的壞習(xí)慣
克服了宏定義不能進(jìn)行參數(shù)類型檢查的弊端
克服了C++函數(shù)重載用相同函數(shù)名字重寫幾個(gè)函數(shù)的繁瑣
缺點(diǎn) :調(diào)試比較困難
16.容器 :可容納各種數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)
迭代器 :可依次存取容器中元素的東西
算法 :用來操作容器中的元素的函數(shù)模版,例如, STL用sort()來對(duì)一個(gè)vector中的數(shù)據(jù)進(jìn)行排序,用find()來搜索一個(gè)list中的對(duì)象
17.函數(shù)本身與他們操作的數(shù)據(jù)的結(jié)構(gòu)和類型無關(guān)。
18.容器概述 :
1)可以用于存放各種類型的數(shù)據(jù)(基本類型的變量,對(duì)象等)的數(shù)據(jù)結(jié)構(gòu)
2)容器分為三大類:
1) 順序容器
vector : 后不插入/刪除,直接訪問
deque ?: ?前/后部插入/刪除,直接訪問
list : ?雙向鏈表,任意位置插入/刪除
2) ?關(guān)聯(lián)容器?
set : 快速查找,無重復(fù)元素
multiset : 快速查找,可有重復(fù)元素
map : 一對(duì)一映射,無重復(fù)元素,基于關(guān)鍵字查找
multimap :一對(duì)一映射,可有重復(fù)元素,基于關(guān)鍵字查找
前兩者和稱為第一類容器
3)容器適配器
stack : LIFO
queue : FIFO
priority_queue : 優(yōu)先級(jí)高的元素先出
3)對(duì)象被插入容器中時(shí),被插入的是對(duì)象的一個(gè)復(fù)制品
許多算法, 比如排序,查找,要求對(duì)容器中的元素進(jìn)行比較,所以,放入容器的對(duì)象所屬的類,還應(yīng)該實(shí)現(xiàn) == 和 < 運(yùn)算符
19.順序容器簡介
1) vector 頭文件 <vector>
實(shí)際上就是個(gè)動(dòng)態(tài)數(shù)組。隨機(jī)存取任何元素都能在常數(shù)時(shí)間完成。在尾端增刪元素具有較佳的性能。
2) deque 頭文件 <deque>
也是個(gè)動(dòng)態(tài)數(shù)組,隨機(jī)存取任何元素都能在常數(shù)時(shí)間完成(但性能次于vector)。在兩端增刪元素具有較佳的性能。
3) list 頭文件 <list>
雙向鏈表,在任何位置增刪元素都能在常數(shù)時(shí)間完成。不支持隨機(jī)存取。
上述三種容器稱為順序容器,是因?yàn)樵氐牟迦胛恢猛氐闹禑o關(guān)。
20.關(guān)聯(lián)容器簡介
關(guān)聯(lián)式容器內(nèi)的元素是排序的,插入任何元素,都按相應(yīng)的排序準(zhǔn)則來確定其位置。關(guān)聯(lián)式容器的特點(diǎn)是在查找時(shí)具有非常好的性能。
1) set/multiset: 頭文件 <set>
set 即集合。set中不允許相同元素,multiset中允許存在相同的元素。
2) map/multimap: 頭文件 <map>
map與set的不同在于map中存放的是成對(duì)的key/value。并根據(jù)key對(duì)元素進(jìn)行排序,可快速地根據(jù)key來檢索元素map同multimap的不同在于是否允許多個(gè)元素有相同的key值。
?上述4種容器通常以平衡二叉樹方式實(shí)現(xiàn),插入和檢索的時(shí)間都是 O(logN)
21.容器適配器簡介
1) stack :頭文件 <stack>
棧。是項(xiàng)的有限序列,并滿足序列中被刪除、檢索和修改的項(xiàng)只能是最近插入序列的項(xiàng)。即按照后進(jìn)先出的原則
2) queue :頭文件 <queue>
隊(duì)列。插入只可以在尾部進(jìn)行,刪除、檢索和修改只允許從頭部進(jìn)行。按照先進(jìn)先出的原則。
3)priority_queue :頭文件 <queue>
優(yōu)先級(jí)隊(duì)列。最高優(yōu)先級(jí)元素總是第一個(gè)出列
22.容器的共有成員函數(shù)
1) 所有標(biāo)準(zhǔn)庫容器共有的成員函數(shù):
相當(dāng)于按詞典順序比較兩個(gè)容器大小的運(yùn)算符:
=, < , <= , > , >=, == , !=
empty : 判斷容器中是否有元素
max_size: 容器中最多能裝多少元素
size: 容器中元素個(gè)數(shù)
swap: 交換兩個(gè)容器的內(nèi)容
2) 只在第一類容器中的函數(shù):
begin 返回指向容器中第一個(gè)元素的迭代器
end 返回指向容器中最后一個(gè)元素后面的位置的迭代器
rbegin 返回指向容器中最后一個(gè)元素的迭代器
rend 返回指向容器中第一個(gè)元素前面的位置的迭代器
erase 從容器中刪除一個(gè)或幾個(gè)元素
clear 從容器中刪除所有元素
head Tail
rend begin rbegin end
23.迭代器
1).用于指向第一類容器中的元素。有const 和非 const兩種。
2).通過迭代器可以讀取它指向的元素,通過非const迭代器還能修改其指向的元素。迭代器用法和指針類似。
3).定義一個(gè)容器類的迭代器的方法可以是:
容器類名::iterator 變量名;
或:
容器類名::const_iterator 變量名;
4).訪問一個(gè)迭代器指向的元素:
* 迭代器變量名
5).迭代器可以執(zhí)行++操作,以指向容器中的下一個(gè)元素,如果迭代器到達(dá)了容器中的最后一個(gè)元素的后面,則迭代器變成past-the-end值
注意:使用一個(gè)past-the-end值的迭代器來訪問對(duì)象是非法的
6).STL中的迭代器
STL 中的迭代器按功能由弱到強(qiáng)分為5種:
1. 輸入:Input iterators 提供對(duì)數(shù)據(jù)的只讀訪問。
2. 輸出:Output iterators 提供對(duì)數(shù)據(jù)的只寫訪問
3. 正向:Forward iterators 提供讀寫操作,并能一次一個(gè)地向前推進(jìn)迭代器。
4. 雙向:Bidirectional iterators提供讀寫操作,并能一次一個(gè)地向前和向后移動(dòng)。
5. 隨機(jī)訪問:Random access iterators提供讀寫操作,并能在數(shù)據(jù)中隨機(jī)移動(dòng)。
編號(hào)大的迭代器擁有編號(hào)小的迭代器的所有功能,能當(dāng)作編號(hào)小的迭代器使用
7)不同迭代器所能進(jìn)行的操作(功能)
所有迭代器: ++p, p ++
輸入迭代器: * p, p = p1, p == p1 , p!= p1
輸出迭代器: * p, p = p1
正向迭代器: 上面全部
雙向迭代器: 上面全部,--p, p --,
隨機(jī)訪問迭代器: 上面全部,以及:
p+= i, p -= i,
p + i: 返回指向 p 后面的第i個(gè)元素的迭代器
p - i: 返回指向 p 前面的第i個(gè)元素的迭代器
p[i]: p 后面的第i個(gè)元素的引用
p < p1, p <= p1, p > p1, p>= p1
8)容器所支持的迭代器類別
容器 迭代器類別
vector 隨機(jī)
deque 隨機(jī)
list 雙向
set/multiset 雙向
map/multimap 雙向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器
24.算法簡介
1)STL中提供能在各種容器中通用的算法,比如插入,刪除,查找,排序等。大約有70種標(biāo)準(zhǔn)算法。
算法就是一個(gè)個(gè)函數(shù)模板。
算法通過迭代器來操縱容器中的元素。許多算法需要兩個(gè)參數(shù),一個(gè)是起始元素的迭代器,一個(gè)是終止元素的后面一個(gè)元素的迭代器。比如,排序和查找
有的算法返回一個(gè)迭代器。比如 find() 算法,在容器中查找一個(gè)元素,并返回一個(gè)指向該元素的迭代器。
算法可以處理容器,也可以處理C語言的數(shù)組
2)算法分類
變化序列算法
copy ,remove,fill,replace,random_shuffle,swap, …..
會(huì)改變?nèi)萜?br /> 非變化序列算法:
adjacent-find, equal, mismatch,find ,count, search, count_if, for_each, search_n
以上函數(shù)模板都在<algorithm> 中定義
此外還有其他算法,比如<numeric>中的算法
3)find()
template<class InIt, class T>
InIt find(InIt first, InIt last, const T& val);
first 和 last 這兩個(gè)參數(shù)都是容器的迭代器,它們給出了容器中的查找區(qū)間起點(diǎn)和終點(diǎn)。
這個(gè)區(qū)間是個(gè)左閉右開的區(qū)間,即區(qū)間的起點(diǎn)是位于查找范圍之中的,而終點(diǎn)不是
val參數(shù)是要查找的元素的值
函數(shù)返回值是一個(gè)迭代器。如果找到,則該迭代器指向被找到的元素。如果找不到,則該迭代器指向查找區(qū)間終點(diǎn)。
4).順序容器
除前述共同操作外,順序容器還有以下共同操作:
front() :返回容器中第一個(gè)元素的引用
back() : 返回容器中最后一個(gè)元素的引用
push_back(): 在容器末尾增加新元素
pop_back(): 刪除容器末尾的元素
比如,查 list::front 的help,得到的定義是:
reference front();
const_reference front() const;
list有兩個(gè)front函數(shù)
5)算法解釋
ostream_iterator<int> output(cout ,“*");
定義了一個(gè) ostream_iterator 對(duì)象,可以通過cout輸出以 * 分隔的一個(gè)個(gè)整數(shù)
copy (v.begin(),v.end(),output);
導(dǎo)致v的內(nèi)容在 cout上輸出
copy 函數(shù)模板(算法):
template<class InIt, class OutIt>
OutIt copy(InIt first, InIt last, OutIt x);
本函數(shù)對(duì)每個(gè)在區(qū)間[0, last - first)中的N執(zhí)行一次 *(x+N) = * ( first + N) ,返回 x + N
對(duì)于copy (v.begin(),v.end(),output);
first 和 last 的類型是 vector<int>::const_iterator
output 的類型是 ostream_iterator<int>
25.list容器
在任何位置插入刪除都是常數(shù)時(shí)間, 不支持隨機(jī)存取,除了具有所有順序容器都有的成員函數(shù)外,還支持8個(gè)成員函數(shù) :
push_front : 在前面插入
pop_front : 刪除前面的元素
sort :排序(list 不支持STL的算法sort)
remove : 刪除和指定值相等的所有元素
unique : 刪除所有和前一個(gè)元素相同的元素
merge : 合并兩個(gè)鏈表,并清空被合并的那個(gè)
reverse : 顛倒鏈表
splice : 在指定位置前面插入另一鏈表中的一個(gè)或多個(gè)元素,并在另一鏈表中刪除被插入的元素
26. sort
sort 實(shí)際上是快速排序,時(shí)間復(fù)雜度 O(n*log(n));
平均性能最優(yōu)。但是最壞的情況下,性能可能非常差。
如果要保證“最壞情況下”的性能,那么可以使用stable_sort
stable_sort
stable_sort 實(shí)際上是歸并排序(將兩個(gè)已經(jīng)排序的序列合并成一個(gè)序列),特點(diǎn)是能保持相等元素之間的先后次序
在有足夠存儲(chǔ)空間的情況下,復(fù)雜度為 n * log(n),否則復(fù)雜度為 n * log(n) * log(n)
stable_sort 用法和 sort相同
排序算法要求隨機(jī)存取迭代器的支持,所以list 不能使用排序算法,要使用list::sort
partial_sort : 部分排序,直到 前 n 個(gè)元素就位即可
nth_element : 排序,直到第 n個(gè)元素就位,并保證比第n個(gè)元素小的元素都在第 n 個(gè)元素之前即可
partition: 改變?cè)卮涡?#xff0c;使符合某準(zhǔn)則的元素放在前面
?
轉(zhuǎn)載于:https://www.cnblogs.com/cxw825873709/p/3446341.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的C++(2013.11.27)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下MySql数据库常用操作
- 下一篇: linux c/c++ 代码使用 dox