C STL容器概念

2021-10-21 17:34:27 字數 2975 閱讀 4206

string其實相當於乙個儲存字元的序列容器,因此除了有字串的一些常用操作以外,還有包含了所有的序列容器的操作。字串的常用操作包括:增加、刪除、修改、查詢比較、鏈結、輸入、輸出等
​ 是乙個封裝了動態大小陣列的順序容器,是乙個可以存放任意型別的動態陣列。

​ 實體地址與邏輯位址連續,可以實現快速訪問(首位址+i直接訪問)

1)可以直接訪問任何元素。

2)線性順序結構。可以指定一塊連續的空間,也可以不預先指定大小,空間可自動擴充套件,也可以像陣列一樣被操作,即支援[ ]操作符和vector.at(),因此可看做動態陣列,通常體現在追加資料push_back()和刪除末尾資料pop_back()。

3)當分配空間不夠時,vector會申請一塊更大的記憶體塊(以2的倍數增長),然後將原來的資料拷貝到新記憶體塊中並將原記憶體塊中的物件銷毀,最後釋放原來的記憶體空間。因此如果vector儲存的資料量很大時會很消耗效能,因此在預先知道它大小時效能最優。

4)節省空間。因為它是連續儲存,在儲存資料的區域是沒有浪費的,但實際上大多數時候是存不滿的,因此實際上未儲存的區域是浪費的。

5)在內部進行插入和刪除的操作效率低。由於vector內部按順序表結構設計,因此這樣的操作基本上是被禁止的,它被設計成只能在後端進行追加和刪除操作。

vector與陣列區別:

​ 1.陣列只能手動擴容,vector可以自動擴容

​ 2.陣列插入資料後邊資料必須向後移動,vector可以任意位置插入

函式含義:

​ 1.push_back 在陣列的最後新增乙個資料

​ 2.pop_back 去掉陣列的最後乙個資料

​ 3.at 得到編號位置的資料

​ 4.begin 得到陣列頭的指標

​ 5.end 得到陣列的最後乙個單元+1的指標

​ 6.front 得到陣列頭的引用

​ 7.back 得到陣列的最後乙個單元的引用

​ 8.max_size 得到vector最大可以是多大

​ 9.capacity 當前vector分配的大小

​ 10.size 當前使用資料的大小

​ 11.resize 改變當前使用資料的大小,如果它比當前使用的大,者填充預設值

​ 12.reserve 改變當前vecotr所分配空間的大小

​ 13.erase 刪除指標指向的資料項

​ 14.clear 清空當前的vector

​ 15.rbegin 將vector反轉後的開始指標返回(其實就是原來的end-1)

​ 16.rend 將vector反轉構的結束指標返回(其實就是原來的begin-1)

​ 17.empty 判斷vector是否為空

​ 18.swap 與另乙個vector交換資料

1)是一種優化了的、對序列兩端進行新增和刪除操作、較快速地隨機訪問的基本序列容器。

2)採用多個連續的儲存塊儲存物件,並在乙個對映結構中儲存對這些塊及其順序的跟蹤。由於不需要重新分配空間,因此追加元素時比vector更有效。實際上內部有乙個map指標。

3)支援隨機訪問,即支援[ ]操作符和.at(),但效能不如vector。

4)可以進行內部隨機插入和刪除,但效能不如list。

1)線性鍊錶結構。

2)其資料由若干個節點構成,每個節點包括乙個資訊塊(即實際儲存的資料)、乙個前驅指標和乙個後驅指標。無需分配指定的記憶體大小且可任意伸縮,因此它儲存在非連續的記憶體空間中,並且由指標將有序的元素鏈結起來。因而相比vector它也佔更多的記憶體。

3)根據其結構可知隨機檢索的效能很差,vector是直接找到元素的位址,而它需要從頭開始按順序依次查詢,因此檢索靠後的元素時非常耗時。即不支援[ ]操作符和.at()。

4)由於list每個節點儲存著它在鍊錶中的位置,插入或刪除乙個元素僅對最多三個元素有所影響,因此它可以迅速在任何節點進行插入和刪除操作。

關聯容器是二叉樹結構,它根據元素特點排序,迭代器能以元素的特點「順序地」獲取元素。它是以鍵值的方式來儲存資料,即把關鍵字和值關聯起來儲存,而順序容器只能儲存一種(可以認為它只儲存關鍵字,也可以認為它只儲存值),底層實現是紅黑樹。

1)快速查詢,不允許重複值。

2)按一定順序排列,集合中的每個元素被稱作集合中的例項。

3)內部通過鍊錶的方式組織,因此插入的時候比vector快,但在查詢和末尾追加比vector慢。

1)提供一種「鍵-值」關係的一對一的資料儲存能力。鍵按一定順序排列且不可重複(set也可以看成沒有鍵只有值的特殊map形式)。

2)鍊錶方式儲存,繼承了鍊錶的優缺點。

3)一對多對映,基於關鍵字快速查詢。

不要求元素唯一,其他同上

1)紅黑樹的結構原理。

2)set和map保證了元素的唯一性,mulset和mulmap擴充套件了這一屬性,可以允許元素不唯一。

3)元素是有序的集合,預設在插入的時候按公升序排列。

4)插入和刪除操作比vector快,比list慢。因為vector是順序儲存,而關聯容器是鏈式儲存;而同為鏈式結構,list是線性,而關聯容器是排序的二叉樹結構,因此每次都需要對元素重新排序,涉及到的元素變動更多。

5)對元素的檢索操作比vector慢,比list快很多。vector是順序的連續儲存,這是最快的速度;而list需要逐個搜尋,搜尋時間與容器大小成正比,關聯容器查詢的複雜度log(n),因此容器越大,關聯容器相對list越能體現其優越性。

6)在使用上set區別於順序容器的是查詢上雖然慢於vector,但卻強於list。

7)在使用上map的功能是不可取代的,它儲存了「鍵-值」關係的資料,而這種鍵值關係採用了類陣列的方式。陣列是用數字型別的下標來索引元素的位置,而map是用字元型關鍵字來索引元素的位置。在使用上map也提供了一種類陣列操作的方式,即它可以通過下標來檢索資料。在stl中只有vector和map可以通過類陣列的方式操作元素。

C STL 容器重要概念

本文所有內容均在 gnu c 64位 裡瞎搞出來,有很多猜測,僅供參考 vector deque list forward list set allocator map allocator pair unordered set t,hash,equal to,allocator unordered ...

c STL 容器 聯合容器

stl提供了四種聯合容器 set,multiset,map,multimap set and multiset在標頭檔案 map and multimap在標頭檔案 模板函式都一樣的 set map中迭代器不能 或 因為不是連續的序列,是樹。set 在set中,值就是關鍵字,集合中不會有多個相同的關...

C STL 容器Vector的簡單概念和用法

一 vector的概念 模板類vector類似於string類,本質上也是一種動態陣列。它是使用new運算子動態建立陣列的替代品。實際上,vector類確實用new和delete運算子來管理記憶體 計算機自動完成 因此,vector類所建立的物件都儲存在自由儲存區即 free store。二 使用v...