C 面試基礎知識 C C 篇(二)

2021-09-11 07:45:51 字數 2079 閱讀 8784

vector的元素排列和操作方式與array很相似,不同的是vector是動態空間,能夠隨著元素的新增自動擴充套件空間。它的實現關鍵在於對大小的控制以及重新配置空間時移動元素的效率。

vector的iterator定義是value_type*,也就是普通的指標。因為vector維護的空間是乙個連續線性空間,所以普通的指標就能滿足vector迭代器的所有需求

vectord的構造與記憶體管理

vector的定義預設使用的是alloc作為空間配置器,並且為了方便以元素大小為配置單位定義了data_allocator。data_allocator::allocate(n)會分配n個元素空間大小,uninitialized_fill_n則會根據迭代器的型別特性(詳見《stl原始碼剖析》筆記-迭代器iterators)選擇效率較高的方式進行構造。

當使用push_back()將元素插入尾部時,會先檢查是否有備用空間,如果有就直接在備用空間中構造,並調整迭代器finish。否則,就需要進行擴充套件空間,vector擴充套件空間的方式是申請新的空間,然後把原有的內容複製過來,然後釋放原有空間,這是為了保證空間的連續性。因此,一旦發生了空間的擴充套件,原有的迭代器全都會失效,這點需要特別注意。

相較於vector的連續線性空間,list就複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且,對於任何位置的元素插入或元素移除,list永遠是常數時間。

list的節點

template struct __list_node

;

以上是list節點的結構體,可以看出list是乙個雙向鍊錶。

list的迭代器

ist和vector不同,不能使用原始指標作為迭代器的value_type,因為list不能保證元素是線性連續的。list的迭代器需要具備前移、後移的能力,因此是bidirectional iterators。list的插入操作不會造成迭代器失效,刪除操作只導致被刪除的迭代器失效。

deque是一種雙向開口的分段連續線性空間,可以在頭部/尾部進行元素的插入和刪除。它與vector最大的差異,一是deque允許於常數時間內對頭端進行插入或刪除元素,二是deque是由分段連續線性空間組合而成,隨時可以增加一段新的空間,不像vector那樣,vector當記憶體不夠時,需要重新分配空間。

deque也提供ramdom access iterator,但是不是原始指標,相比起來要複雜得多,因此也影響了運算效率,所以盡量使用vector少用deque。

deque的中控器

deque在邏輯上是連續線性空間,由一段一段的定量連續空間構成。一旦需要在前端或尾端增加新空間,就配置一段定量的連續空間進行串接。與vector相比避免了重新配置空間的消耗,代價就是更複雜的迭代器。為了管理這些分段空間,deque引入了所謂的map作為主控。map是一小塊連續空間,其中每個元素都是指向緩衝區的指標,緩衝區才是deque儲存資料的主體:

deque的迭代器

deque分段連續空間的實現,主要有迭代器的operator++和operator–來負責。deque迭代器必須能夠判斷目前的緩衝區,以及是否在當前緩衝區的邊界,這樣才能決定是否要跳轉到另乙個緩衝區。而為了找到其他緩衝區,必須要能夠控制中控器map。

deque的迭代器對各種指標運算都進行了過載,其中最關鍵的就是當遇到緩衝區邊緣時需要特殊處理:

deque處理維護指向map的指標外,還需要維護start和finish兩個迭代器,分別是第乙個緩衝區的第乙個元素和最後乙個緩衝區的最後乙個元素後乙個位置。還需要記錄當前map的大小,如果空間不足就需要重新配置:

deque在開始和最後新增元素都一樣快,並提供了隨機訪問方法,像vector一樣使用訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內部處理堆跳轉

預設底層容器是deque

C 面試基礎知識 C C 篇(一)

1 成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。因為成員變數的初始化次序是根據變數在記憶體中次序有關,而記憶體中的排列順序早在編譯期就根據變數的定義次序決定了。2 如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位...

C 基礎知識篇

1.命名空間 在c 中,識別符號 name 可以是符號常量 變數 巨集 函式 結構 列舉 類和物件等。為了避免在大規模程式設計中以及在程式設計師使用各種各樣的c 庫時,這些識別符號的命名發生衝突,標準c 引入了關鍵字namespace 命名空間 以便更好控制識別符號作用域。定義格式如下 namesp...

C 基礎知識總結 二 菜鳥篇

1.一般情況下。如果 號兩邊有乙個為字串型別的資料,則這個加號就起到連線的作用,不是數值相加的作用。2.佔位符的基本使用.佔位符就好比是乙個挖坑的過程,先挖坑,再填坑,注意大括號裡面的數字從0開始。3.在控制台程式裡面,無論是使用者輸入到控制台上的還是控制台上輸出顯示給使用者的,全都是字串型別,一般...