C 容器 一文讀懂

2021-10-09 18:05:45 字數 3174 閱讀 3693

stl(標準模板庫),是目前c++內建支援的library。它的底層利用了c++類模板和函式模板的機制,由三大部分組成:容器、演算法和迭代器。這部分主要介紹容器,自己整合,總結的筆記,供參考。

stl有六大元件

容器:用來管理某類物件的集合。每一種容器都有其優點和缺點,所以,為了應付程式中的不同需求,stl 準備了七種基本容器型別。

容器用來管理某類物件。為了應付程式中的不同需求,stl 準備了兩類共七種基本容器型別:

順序容器

功能vector支援快速隨機訪問

list支援快速插入/刪除

deque雙端佇列

vector(向量): 和陣列差不多,但它比陣列更優越。一般來說陣列不能動態拓展,因此在程式執行的時候不是浪費記憶體,就是造成越界。而 vector 正好彌補了這個缺陷,它的特徵是相當於可拓展的陣列(動態陣列),它的隨機訪問快,在中間插入和刪除慢,但在末端插入和刪除快。

優點:支援隨機訪問,即 操作和 .at(),所以查詢效率高。

缺點:當向其頭部或中部插入或刪除元素時,為了保持原本的相對次序,插入或刪除點之後的所有元素都必須移動,所以插入的效率比較低。

適用場景:適用於物件簡單,變化較小,並且頻繁隨機訪問的場景。

以下例子針對整型定義了乙個 vector,插入 6 個元素,然後列印所有元素:

#include #include using namespace std;

int main(int argc, char* ar**)

return 0;

}

輸出結果:1 2 3。一共插入了 4 個數,但是集合中只有 3 個數並且是有序的,可見之前說過的 set 集合的兩個特點,有序和不重複。

當 set 集合中的元素為結構體時,該結構體必須實現運算子 『

#include #include #include using namespace std;

struct people

};int main(int argc, char* ar**)

); settemp.insert();

settemp.insert();

set::iterator it;

for (it = settemp.begin(); it != settemp.end(); it++)

return 0;}/*

輸出結果

姓名:王二麻子 年齡:10

姓名:張三 年齡:14

姓名:李四 年齡:16

*/

可以看到結果是按照年齡由小到大的順序排列。另外 string 要使用c_str()轉換一下,否則列印出的是亂碼。

另外 multiset 和 set 相同,只不過它允許重複元素,也就是說 multiset 可包括多個數值相同的元素。這裡不再做過多介紹。

map 由紅黑樹實現,其元素都是 「鍵值/實值」 所形成的乙個對組(key/value pairs)。每個元素有乙個鍵,是排序準則的基礎。每乙個鍵只能出現一次,不允許重複。

map 主要用於資料一對一對映的情況,map 內部自建一顆紅黑樹,這顆樹具有對資料自動排序的功能,所以在 map 內部所有的資料都是有序的。比如乙個班級中,每個學生的學號跟他的姓名就存在著一對一對映的關係。

優點:使用平衡二叉樹實現,便於元素查詢,且能把乙個值對映成另乙個值,可以建立字典。

缺點:每次插入值的時候,都需要調整紅黑樹,效率有一定影響。

適用場景:適用於需要儲存乙個資料字典,並要求方便地根據key找value的場景。

#include "stdafx.h"

#include #include #include using namespace std;

int main(int argc, char* ar**)

); maptemp.insert();

maptemp.insert();

map::iterator it;

for (it = maptemp.begin(); it != maptemp.end(); it++)

return 0;}/*

輸出結果:

學號:3 姓名:李四

學號:4 姓名:隔壁老王

學號:5 姓名:張三

*/

multimap 和 map 相同,但允許重複元素,也就是說 multimap 可包含多個鍵值(key)相同的元素。

除了以上七個基本容器類別,為滿足特殊需求,stl還提供了一些特別的(並且預先定義好的)容器配接器,根據基本容器類別實現而成。包括:

名字說明了一切,stack 容器對元素採取lifo(後進先出)的管理策略。

queue 容器對元素採取 fifo(先進先出)的管理策略。也就是說,它是個普通的緩衝區(buffer)。

priority_queue 容器中的元素可以擁有不同的優先權。所謂優先權,乃是基於程式設計師提供的排序準則(預設使用 operators)而定義。priority queue 的效果相當於這樣乙個 buffer:「下一元素永遠是queue中優先順序最高的元素」。如果同時有多個元素具備最髙優先權,則其次序無明確定義。

在實際使用過程中,到底選擇這幾種容器中的哪乙個,應該根據遵循以下原則:

1、如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用 vector。

2、如果需要大量的插入和刪除元素,不關心隨機訪問的效率,使用 list。

3、如果需要隨機訪問,並且關心兩端資料的插入和刪除效率,使用 deque。

4、如果打算儲存資料字典,並且要求方便地根據 key 找到 value,一對一的情況使用 map,一對多的情況使用 multimap。

5、如果打算查詢乙個元素是否存在於某集合中,唯一存在的情況使用 set,不唯一存在的情況使用 multiset。

各容器的時間複雜度分析

各容器的共性

各容器一般來說都有下列函式:預設建構函式、複製建構函式、析構函式、empty()、max_size()、size()、operator=、operator、operator>=、operator==、operator!=、swap()。

順序容器和關聯容器函式總結(請忽略試用- -):

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...