
本次烤面筋,基于昨晚被虐的基礎上,補缺補漏,
昨晚已經總結好了,不過我設定了本人可見,有些內容比較私密,
文章目錄
- Question One:純虛函式和虛函式的區別
- Question Two:請你來說一下map和set有什么區別,分別又是怎么實作的?
- Question Three:請你來說一說STL迭代器洗掉元素
- Question Four:請你來說一下STL中迭代器的作用,有指標為何還要迭代器
- Question Five: 請你來說一下C++中struct和class的區別
Question One:純虛函式和虛函式的區別
1、定義方式的不同,
純虛函式:virtual void func() = 0;
虛函式:virtual void func();
2、含有純虛函式的類稱為抽象類,如果一個類中含有純虛函式,那么任何試圖對該類進行實體化的陳述句都將導致錯誤的產生,因為抽象基類(ABC)是不能被直接呼叫的,必須被子類繼承多載以后,根據要求呼叫其子類的方法,
3、虛函式可以被直接使用,也可以被子類(sub class)多載以后以多型的形式呼叫,而純虛函式必須在子類(sub class)中實作該函式才可以使用,因為純虛函式在基類(base class)只有宣告而沒有定義,
4、在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態系結(run-time bind),而且被兩者修飾的函式生命周期(life recycle)也不一樣,
接下來繼續把基礎相關的過一下,作業系統之類的后面有安排,循序漸進嘛,
Question Two:請你來說一下map和set有什么區別,分別又是怎么實作的?
(1)map中的元素是key-value(關鍵字—值)對;Set與之相對就是關鍵字的簡單集合,set中每個元素只包含一個關鍵字,
(2)set的迭代器是const的,不允許修改元素的值;map允許修改value,但不允許修改key,
map和set是根據關鍵字排序來保證其有序性的,如果允許修改key的話,那么首先需要洗掉該鍵,然后調節平衡,再插入修改后的鍵值,調節平衡,如此一來,嚴重破壞了map和set的結構,導致iterator失效,
(3)map支持下標操作,set不支持下標操作,
set 底層是通過紅黑樹(RB-tree)來實作的,又由于 set 所開放的各種操作介面,RB-tree 也都提供了,所以幾乎所有的 set 操作行為,都只有轉呼叫 RB-tree 的操作行為而已,
map也是如此,
Question Three:請你來說一說STL迭代器洗掉元素
這個問題啊,其實已經說過很多遍了,在C++里面說過,在Python里面也說過,
1.對于序列容器vector,deque來說,使用erase(itertor)后,會出現各種各樣的問題,比方說出現野指標、foreach中洗掉啊等的,反正這樣寫就好:
vector<int>::iterator itor2;
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == 3)
{
itor2=iter;
veci.erase(itor2);
}
else
iter ++ ;
}
2.對于關聯容器map set來說,使用了erase(iterator)后,當前元素的迭代器失效,但是其結構是紅黑樹,洗掉當前元素的,不會影響到下一個元素的迭代器,所以在呼叫erase之前,記錄下一個元素的迭代器即可,
3.對于list來說,它使用了不連續分配的記憶體,并且它的erase方法也會回傳下一個有效的iterator,因此上面兩種正確的方法都可以使用
Question Four:請你來說一下STL中迭代器的作用,有指標為何還要迭代器
Iterator(迭代器)模式又稱Cursor(游標)模式,用于提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示,
迭代器不是指標,是類模板,表現的像指標,他只是模擬了指標的一些功能,通過多載了指標的一些運算子,->、*、++、–等,
迭代器回傳的是物件參考而不是物件的值,所以cout只能輸出迭代器使用*取值后的值而不能直接輸出其自身,
Question Five: 請你來說一下C++中struct和class的區別
這我倒是沒有關注過,
class可以定義模板類形參,比如template <class T, int i>,
結構體(sturct)是一種值型別,而類(class)是參考型別,區別在于復制方式,值型別的資料是值賦值,參考型別的資料是參考復制,
結構體使用堆疊存盤(Stack Allocation),而類使用堆存盤(Heap Allocation),
堆疊的空間相對較小.但是存盤在堆疊中的資料訪問效率相對較高;堆的空間相對較大.但是存盤在堆中的資料的訪問效率相對較低
結構體使用完之后就自動解除記憶體分配,類實體有垃圾回識訓制來保證記憶體的回收處理 ,
如何選擇結構體還是類
1. 堆疊的空間有限,對于大量的邏輯的物件,創建類要比創建結構好一些
2. 結構體表示如點、矩形和顏色這樣的輕量物件,
3. 在表現抽象和多級別的物件層次時,類是最好的選擇,因為結構體不支持繼承
4. 大多數情況下該型別只是一些資料時,結構體時最佳的選擇

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266366.html
標籤:java
