C 語言學習記錄 33 容器與迭代器

2021-10-20 06:28:16 字數 3861 閱讀 8418

c++提供了一些自然、通用的容器,這些容器能夠容納使用者定義的型別,並提供各種操作,而不需要強制使用者定義的型別具有某種結構。例如向量、鍊錶、佇列都屬於容器。這些容器提供的操作不依賴容器包含的型別

迭代器是一種檢查容器內的元素並遍歷元素的資料型別,標準庫為每一種標準容器定義了一種迭代器型別,迭代器型別提供了比下標操作更通用化的方法:所有標註庫容器都定義了相應的迭代器型別。

迭代器主要分為五類:

輸入迭代器

輸出迭代器

前向迭代器

雙向迭代器

隨機訪問迭代器

向量屬於順序容器,用於容納不定長線性序列,提供對序列的快速隨機訪問。向量是乙個動態結構,大小不固定,可以在程式執行時增加或減少

vector的主要操作有如下幾種

對vector進行初始化時,如果沒有指定元素初始化,標準庫自行提供乙個初始化值進行函式初始化。如果儲存的是含有建構函式的類型別的元素,標準庫產生乙個帶初始值的物件,使用這個物件進行值初始化

雙端佇列是一種放鬆了訪問許可權的佇列,元素可以從佇列的兩端入隊和出隊,也支援通過下標操作符直接訪問

雙端佇列使用前須匯入標頭檔案deque

deque的操作,除了capacity和reverse兩個功能沒有之外,與vector相同,同時,deque還提供函式完成收尾函式的插入和刪除

#include

#include

using

namespace std;

intmain()

列表主要用於存放雙向鍊錶,可以從任意一端開始遍歷,此外還提供了拼接操作splicing,將乙個序列中的元素插入到另乙個序列中,使用前要匯入list標頭檔案

#include

#include

using

namespace std;

intmain()

cout <<

"after deleted the first place of the list"

<< endl;

elements.

erase

(elements.

begin()

);for(iter = elements.

begin()

; iter != elements.

end(

); iter++)if

(!elements.

empty()

) cout <<

"the volume is"

<< elements.

size()

<< endl;

return0;

}

關聯容器是通過鍵值儲存和讀取元素的資料集合,關聯容器讀取和儲存與資料寫入的順序無關,只根據鍵來查詢相對應的元素

乙個集合是乙個容器,其中所包含的元素按一定的順序排列,並被作為集合中的例項。乙個集合通過鍊錶組織,在插入和刪除操作上比向量快,但查詢或新增末尾元素時會有些慢。集可以模擬為python中的字典

集和多集的區別是:集支援唯一鍵值,集中的值都是特定的且只出現一次,多集可以出現副本鍵,同一值可以出現多次

拓展:集和多集容器內部結構通常由平衡二叉樹實現,當元素放入容器中時,會按照一定的排序法則自動排序,預設是按照less排序規則來排序。這種自動排序的特性加速了元素查詢的過程,但是也帶來了乙個問題:不可以直接修改集或多集中的元素值,這樣會可能違反元素自動排序的規則。如果要修改乙個元素的值,必須先刪除原有的元素,再插入新的元素

集的使用首先要插入標頭檔案set

#include

#include

using

namespace std;

intmain()

for(set<

int>

::iterator p = set1.

begin()

; p != set1.

end();

++p)

cout << endl;

if(set1.

insert(3

).second)

cout <<

"set insert seccess"

<< endl;

else

cout <<

"set insert failed"

<< endl;

int a=

; multiset<

int>a;

a.insert

(set1.

begin()

, set1.

end())

; a.

insert

(a, a +10)

; cout << endl;

for(multiset<

int>

::iterator p = a.

begin()

; p != a.

end();

++p)

cout << endl;

return0;

}

在本例中,把3插入set1步驟的操作時一定失敗的,因為集合中已經有這個元素,後面將int型陣列a中所有的值和set1中所有的元素全部插入多集合a中

對映和多重對映是基於某一型別key的鍵集的存在,提供對t型別資料的高效檢索。對對映(map)而言,鍵只是指儲存在容器中的某一成員。與集和多集類似,map不支援副本鍵,而multimap支援副本鍵。但是鍵和值的資料型別不相同,在這一點上與集合不同

鍵本身和集中的元素一樣,是不能修改的,除非刪除

#include

#include

using

namespace std;

intmain()

map<

char

,int

, less<

char

>>

::const_iterator ptr;

ptr = map1.

find

('d');

cout <<

'\n'

<<

(*ptr)

.first <<

":"<<

(*ptr)

.second;

return0;

}

定義了map型的map1,以及map型的迭代器mapiter,map1的鍵型別是char,值型別是int。最後輸出的時候,map按照簡直從小到大排序

標準庫中提供三種容器介面卡:queue、priority_queue和stack,介面卡是標準庫中通用的概念,包括容器介面卡、迭代器介面卡和函式介面卡。本質上介面卡是使一類事物的行為類似於另一類事物行為的一種機制。容器介面卡讓一種已存在的容器型別才用另一種不同的抽象型別的工作方式實現。容器介面卡是用來拓展7種基本容器的

棧允許在底層資料結構的一端執行插入和刪除操作(遵循先入後出的原則)。堆疊可以用任何序列容器實現,主要操作有以下幾個:

佇列類允許在底層資料結構的末尾插入元素,也允許從前面插入元素(遵守先入先出)

佇列能使用list和deque實現,在預設情況下是由deque實現的

主要操作:

優先順序佇列類能夠按照有序的方式在底層資料結構的前面執行刪除操作。

優先順序佇列能夠用stl的序列容器vector和deque實現,預設情況下用vector做底層容器。當元素新增到priority_queue時,他們按優先順序順序插入

這樣,就有最高優先順序的元素,就是從priority_queue中首先被刪除的元素,這通常是利用堆排序來實現的。堆排序總是將最大值(即優先順序最高的元素)放在資料結構的前面。

優先順序佇列的操作與之前的基本相同,除了獲取首部元素的函式變為top()以及沒有back函式。

補充:

C語言學習要點記錄

1.運算的優先順序 算數 關係 邏輯 賦值 逗號運算子 2.複製是程式不良的表現 因為一旦乙個地方有變動要在很多地方修改 3.程式設計的過程中最好使用單一出口 4.本地變數在定義的時候不會預設初始化,引數在定義的時候一定要初始化 5.本地變數的生存期和作用域在定義的塊內 6.程式這次執行正常下次執行...

C語言學習記錄(序)

適用於超級新手小白,自學者,勿噴,謝。為什麼?據我所了解,c語言很適合打基礎,能幫助大多數想要學習其他語言的程式設計師快速入門,並且它適用於大多數平台,相容性很強。所以,經過很長一段時間的考慮和探索,我放棄了原本想要學習的python 網上說比較簡單,且能快速入門 準備學習c語言,這有利於打下基礎。...

C語言學習記錄4

c語言入門 關於形參和實參的說明 1 在定義函式中指定的形參,在未出現函式呼叫時,他們並不占用記憶體中的儲存單元,只有發生呼叫時,才會分配記憶體。2 實參可以是常量 變數或者表示式 有時傳遞的時位址 3 在被定義中,形參必須指定型別 4 實參與形參的型別應相同或賦值相容 5 c語言規定,實參變數對形...