c STL容器基礎

2021-10-09 13:57:06 字數 2372 閱讀 1596

stl序列式容器也叫線性容器.包括 array、vector、deque、list 和 forward_list 容器。

1.stl容器的型別

簡單的理解容器,它就是一些模板類的集合,但和普通模板類不同的是,容器中封裝的是組織資料的方法(也就是資料結構)。stl 提供有 3 類標準容器,分別是序列容器、排序容器和雜湊容器,其中後兩類容器有時也統稱為關聯容器.

1.1 序列容器(線性容器)

序列容器主要包括:vector 向量容器、list 列表容器以及 deque 雙端佇列容器。之所以被稱為序列容器,是因為元素在容器中的位置同元素的值無關,即容器不是排序的。將元素插入容器時,指定在什麼位置,元素就會位於什麼位置。

1.2 排序容器

包括 set 集合容器、multiset多重集合容器、map對映容器以及 multimap 多重對映容器。排序容器中的元素預設是由小到大排序好的,即便是插入元素,元素也會插入到適當位置。所以關聯容器在查詢時具有非常好的效能。

1.3雜湊容器

c++11 新加入 4 種關聯式容器,分別是 unordered_set 雜湊集合、unordered_multiset 雜湊多重集合、unordered_map 雜湊對映以及 unordered_multimap 雜湊多重對映。和排序容器不同,雜湊容器中的元素是未排序的,元素的位置由雜湊函式確定。

2 .迭代器的類別

常用的迭代器按功能強弱分為輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器(順序迭代器)、隨機訪問迭代器 5 種.

2.1 前向迭代器(forward iterator)

假設 p 是乙個前向迭代器,則 p 支援 ++p,p++,*p 操作,還可以被複製或賦值,可以用 == 和 != 運算子進行比較。此外,兩個正向迭代器可以互相賦值。

2.2 雙向迭代器(bidirectional iterator)

雙向迭代器具有正向迭代器的全部功能,除此之外,假設 p 是乙個雙向迭代器,則還可以進行 --p 或者 p-- 操作(即一次向後移動乙個位置)。

2.3 隨機訪問迭代器

隨機訪問迭代器具有雙向迭代器的全部功能。除此之外,假設 p 是乙個隨機訪問迭代器,i 是乙個整型變數或常量,則 p 還支援以下操作:

p+=i:使得 p 往後移動 i 個元素。

p-=i:使得 p 往前移動 i 個元素。

p+i:返回 p 後面第 i 個元素的迭代器。

p-i:返回 p 前面第 i 個元素的迭代器。

p[i]:返回 p 後面第 i 個元素的引用

此外,兩個隨機訪問迭代器 p1、p2 還可以用 <、>、<=、>= 運算子進行比較。另外,表示式 p2-p1 也是有定義的,其返回值表示 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。

2.4 不同容器的迭代器

容器和迭代器的對應關係

容器對應的迭代器

array

隨機迭代器

vector

隨機迭代器

deque

隨機迭代器

list

雙向迭代器

map/multimap

雙向迭代器

set/multiset

雙向迭代器

forward_list

前向迭代器

unordered_map / unordered_multimap

前向迭代器

unordered_set / unordered_multiset

前向迭代器

stack

不支援迭代器

queue

不支援迭代器

2.5 迭代器的定義方式

迭代器的定義方式

具體格式

正向迭代器

容器類名::iterator 迭代器名;

常量正向迭代器

容器類名::const_iterator 迭代器名;

反向迭代器

容器類名::reverse_iterator 迭代器名;

常量反向迭代器

容器類名::const_reverse_iterator 迭代器名

通過定義以上幾種迭代器,就可以讀取它指向的元素,*迭代器名就表示迭代器指向的元素。其中,常量迭代器和非常量迭代器的分別在於,通過非常量迭代器還能修改其指向的元素。另外,反向迭代器和正向迭代器的區別在於:

對正向迭代器進行 ++ 操作時,迭代器會指向容器中的後乙個元素;

而對反向迭代器進行 ++ 操作時,迭代器會指向容器中的前乙個元素。

以上 4 種定義迭代器的方式,並不是每個容器都適用。有一部分容器同時支援以上 4 種方式,比如 array、deque、vector;而有些容器只支援其中部分的定義方式,例如 forward_list 容器只支援定義正向迭代器,不支援定義反向迭代器。

c STL 容器 聯合容器

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

C STL容器總結

三大類容器 1.序列式容器 vector deque list vector是一種動態陣列,在記憶體中具有連續的儲存空間,支援快速隨機訪問。由於具有連續的儲存空間,所以在插入和刪除操作方面,效率比較慢。vector有多個建構函式,預設的建構函式是構造乙個初始長度為0的記憶體空間,且分配的記憶體空間是...

C STL容器運用

priority queue 優先佇列 是定義在 標頭檔案中的乙個模板類,與佇列相比,優先佇列不是按照入隊順序出隊,而是按照佇列中元素的優先權出隊。預設情況下,按照大者優先的順序出隊,也可以指定運算元來指定所需的優先順序。priority queueq1 定義資料型別為int,預設大的先出隊 pri...