初識STL和容器

2021-07-16 03:39:36 字數 4034 閱讀 8605

stl概念

stl是

c++標準庫的最重要的組成部分,

stl(標準模板庫)不僅是乙個可復用的元件庫,而且是乙個包羅演算法和資料結構的軟體框架。

stl的六大元件

1.容器-

各種資料結構(

vector

、list

、map

、set

等);2.迭代器-

扮演容器和演算法的膠合劑;

3.空間配置器-

負責記憶體空間的分配與管理;

4.配接器-

一種修飾容器或者仿函式或者迭代器介面的東西;

5.演算法-

各種常見演算法(

sort

、search

、copy

等);6.仿函式(行為類似函式的類,用作演算法的某種策略)。

容器:

stl是乙個標準的

c++庫,容器是其中的乙個重要組成部分。

容器包括:順序容器、關聯容器。

容器:容器是容納特定型別物件的集合,因此容器裡面的物件必須是同一型別,而且該型別必須是可拷貝構造和可賦值的,包括的型別有內建的基本資料型別和帶有公用拷貝建構函式和賦值操作符的類。

容器可視為是陣列的擴充套件,即物件的陣列(廣義陣列),其中的元素(物件)通過容器對「

」的過載,可以和陣列一樣利用下標(索引)來訪問。

注意:stl

中的容器可以包含的型別有內建的基本資料型別和帶有公用拷貝建構函式和賦值操作符的類。

(1)順序容器

順序容器,指的是將一組具有相同型別t

的物件,以嚴格的線性形式組織在一起,可以視為陣列和鍊錶的推廣。包括以下3種:

vector:是一種順序容器,存放的元素是以連續的陣列的方式儲存的,可通過

v[i]

的方式訪問

vector

中的元素,此時

vector

的訪問時間是非常小的。而在對特定的值進行訪問時,只能通過遍歷

vector

的方式進行比較,這樣的操作會導致較大的時間開銷。同時在對

vector

的中間插入或刪除元素時,由於需要保持元素的連續性,通常會導致

vector

把後面的元素複製一遍,因此,在隨機插入方面

vector

相對來說效能較低。

vector新增資料的預設方法是

push_back(),push_back()

函式表示將資料新增到

vector

的尾部,並按需要分配記憶體,如在

vector

中新增10

個資料,需要編寫如下**:

for (int i = 0; i < 10; i++)

empty()函式可以判斷vector是否存放兩種資料;size()可以獲取vector的大小;

vector提供了erase(),pop_back(),clear()來刪除資料。

deque:是乙個雙端佇列,存放的資料不是以連續的形式存放的,其操作介面和

vector

類似。list:一種鍊錶的實現,儲存的元素是通過使用雙向鍊錶實現的。優勢在於在

list

的任意位置進行插入和刪除時,非常的快速。但是對於

list

中的內容只能通過連續的方式對元素進行訪問,如需要對

list

中的第1000

個元素進行訪問,並修改其中的資料,只能從

list

的開頭開始乙個乙個地移動,直到到達第

1000

個元素為止,因此

list

在查詢和隨機訪問時需要耗費更大的開銷。

(2)關聯容器

關聯容器是能夠通過鍵值(關鍵字)來查詢和讀取元素的容器,提供乙個key

(鍵)實現對元素的隨機訪問,其特點是

key是有序的,即元素是按預定義的鍵順序(例如公升序)插入的。關聯容器具有從基於鍵的集合中快速提取物件的能力,其中集合的大小在執行時是可變的。包括以下4種:

set(集合

):支援唯一鍵值,並提供對鍵本身的快速檢索;例如:

set:

(set

類的標頭檔案);

multiset(多重集合

):支援可重複鍵值,並提供對鍵本身的快速檢索;例如

set:

(可能有同名的)(

multiset

類的標頭檔案是);

map:支援唯一

key型別的鍵值,並提供對另乙個基於鍵的型別

t的快速檢索;例如

map:、等(

map類的標頭檔案是);

multimap(多重對映

):支援可重複

key型別的鍵值,並提供對另乙個基於鍵的型別

t的快速檢索;例如

map:、等(

multimap

類的標頭檔案是

)。map的元素是「鍵

-值」對的二元組形式,即鍵用作元素在

map中的索引,而值則表示所儲存和讀取的資料。

set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。如果需要乙個鍵對應多個例項,則需要使用

multimap

或multiset

型別,這兩種型別允許多個元素擁有相同的鍵。

set所包含的元素的值是唯一的,集合中的元素按一定順序排列,並作為集合中的例項,乙個集合通過乙個鍊錶來組織,在插入操作和刪除操作上比

vector

快,但查詢或新增末尾的元素時會有些慢。

另外,在stl中有3

種容器介面卡(空間配置器):

stack(棧

):只支援

top()

(讀取棧頂元素)、

push()

(在棧頂處加入新元素)和

pop()

(取出棧頂元素)操作(後進先出)的一種序列容器。(

stack

類的標頭檔案是);

queue(佇列):與

stack

類似,queue

也是對序列容器的限制實現。與棧相比,佇列也支援

back()

(讀取隊尾處的元素)和

push_back()(

在隊尾處插入新元素

)操作,但是不再支援

pop_back()(

取出隊尾處的元素

)操作。不過,佇列允許

front()(

讀取隊首處的元素)和

pop_front()(

取出隊首處的元素

)操作(前出後入)。(

queue

類的標頭檔案是);

priority_queue(優先佇列

):也是一種佇列

queue

,不過其中的每個元素都被給定了乙個優先順序,用來控制元素到達隊首

top()

的順序。 預設情況下,優先佇列簡單地使用運算子

<

進行元素比較,

top()

返回最大的元素。

迭代器

迭代器就如同乙個指標,事實上,c++

中的指標也是一種迭代器。迭代器類似與指標一樣,能夠使用

*操作符類獲取資料,還可使用自增操作符和+、

-運算子對迭代器進行操作,用以訪問容器中的物件。迭代器有兩個位置可以通過容器的

begin()

操作和end()

操作獲取,其中

begin

指向容器中的第乙個元素,

end指向容器中的最後乙個元素的下乙個位置,也就是說

end所指向的並不是容器的元素,通常

begin

和end

之間的範圍就是迭代器的範圍。

注意:在使用迭代器之前,不應該儲存操作end()

的返回值。因為如果在儲存

end()

的返回之後,使用舊的

end()

值很可能所指向的元素已經不存在或者是死迴圈,再對容器的元素進行插入和刪除,將會導致

end()

迭代器失效。

初識容器 容器背景和基礎

背景就不說了吧 能夠讓 container 在 host 上執行起來的那些技術 open container initiative oci 容器runtime 分類 容器管理工具 rkt cli rkt 的管理工具 容器定義工具 registies 容器os 容器平台技術能夠讓容器作為集群在分布式環...

STL之map容器和multimap容器

所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...

STL之map容器和multimap容器

所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...