每日複習筆記4 28

2021-10-05 13:45:12 字數 4552 閱讀 2532

感覺這個部分真的是重難點啊,用好的真好用,用不好是,哎,我是菜雞。

有乙個順序容器順序容器介面卡的概念,這裡先寫點關於順序容器的吧。

常見的順序容器有vectorlistdeque三種。

順序容器的定義

所有的容易都是類模板,通過模板可以編寫乙個類定義,而用於多個不同的資料型別。

容器元素的初始化

表示式功能c c;

建立乙個名為c的空容器。c為容器的型別,例如vector;t為容器中元素的型別,例如int,string。適用於所有容器

c c(c2);

建立容器c2的副本;這裡c和c2必須是相同的容器型別,並且存放著相同型別的元素適用於所有容器

c c(b,e);

建立c,其元素是迭代器b和e標示的範圍內元素的副本。適用於所有容器

c c(n,t);

用n個值為t的元素建立容器c,其中值t必須是容器型別c的元素型別的值,或者可以轉換為該型別的值。只適用於順序容器

c c(n);

建立n個值初始化元素的容器c。只適用於順序容器

值初始化:如果指定元素的初始化式,那麼標準庫將自行提供乙個元素初始值進行值初始化

將乙個容器初始化為另乙個容器的副本時,兩者的容器型別資料型別都必須相同。但是,可以用乙個容器的一部分元素初始化另乙個容器。這種方式不要求容器型別相同,而且原容器的元素型別可以轉換成目標容器的資料型別即可。不過這種方式需要利用迭代器間接的實現。

vector svec;

list

slist

(svec.

begin()

,svec.

end())

;vector

::iterator mid = svec.

begin()

+ svec.

size()

/2;deque

front

(svec.

begin()

,mid)

;

容器內元素的型別約束

容器內的元素型別需要滿足以下兩個要求

a)元素型別必須支援賦值操作。

b)元素型別的物件必須可以複製。

因此io物件不能作為容器的資料型別,io物件既不支援複製,也不支援賦值。

迭代器和迭代器範圍

以下是標準庫容器型別所提供的操作,這些操作時通用的。

表示式功能

*iter

返回迭代器iter所指向的元素的引用

iter->mem

對iter進行解引用,獲取指定元素中名為mem的成員。等效於(*iter).mem

++iter或者iter++

iter加1,使其指向容器裡的下乙個元素

- -iter或者iter- -

iter減1,使其指向容器裡的前乙個元素

iter1 == iter2或iter1 != iter2

比較兩個迭代器是否相等或者不等。當兩個迭代器指向同乙個容器的同乙個元素,或者當它們都指向同乙個容器的超出末端的下乙個位置時,兩個迭代器相等

此外對於vector和deque容器的迭代器還有額外的操作。

表示式功能

iter + n iter - n

在迭代器上加或者減整數值n,將產生指向容器中前面(後面)第n個元素的迭代器。新計算出來的迭代器必須指向容器中的元素或超出容器末端的下乙個位置。

iter1 - iter2

兩個迭代器的減法(其運算結果加上右邊的迭代器就可以得到左邊的迭代器。)個人理解結果就是兩個迭代器之間的距離。

>,>=,<,<=

迭代器的關係操作符,當乙個迭代器只想的元素在容器中位於另乙個迭代器指向元素之前,則前乙個迭代器小於後乙個迭代器。關係操作符的兩個迭代器必須指向同乙個迭代器或者超出容器末尾的下乙個位置。

迭代器範圍

c++語言使用一對迭代器標記迭代器範圍,這兩個迭代器分貝指向同乙個容器的兩個元素或者超出末端的下乙個位置。通常命名為first和last,用於標記容器中一段元素的範圍。左閉右開區間,表示這個範圍從first開始,到last結束,但是不包括last。

對於迭代器first和last有以下兩個要求:

a)他們指向同乙個容器的元素或者超出末端的下乙個位置

b)如果兩個迭代器不相等,則對first反覆做自增運算必須能夠到達last。換而言之,在容器中,last不能位於first之前。

注意:編譯器檢查不出迭代器是否滿足上述要求。如果不滿足上述要求,將導致未知的執行時錯誤。

使迭代器失效的容器操作

後面將會提到一些容器的操作會修改容器的內在狀態或者移動容器中的元素。這樣的操作會使所有指向被移動元素的迭代器失效,也可能使其他迭代器也失效。這樣無效的迭代器會造成類似於懸垂指標的問題。

順序容器的操作

每種順序容器都提供了一下操作:

a)在容器中新增元素

b)在容器中刪除元素

c)設定容器大小

d)(如果存在)獲取容器內的第乙個和最後乙個元素

begin成員和end成員 操作

含義c.begin()

返回乙個迭代器,它指向容器中的第乙個元素

c.end()

返回乙個迭代器,它指向容器中的最後乙個元素的下乙個位置

c.rbegin()

返回乙個逆序迭代器,它指向容器中的最後乙個元素

c.rend()

返回乙個逆序迭代器,它指向容器中的第乙個元素前面的乙個位置

在順序容器中新增元素 操作

含義c.push_back()

在容器c的尾部新增值為t的元素,返回void型別

c.push_front()

在容器c的前端新增值為t的元素,返回void型別只適用於list和deque容器

c.insert(p,t)

在迭代器p所指向的元素前面插入值為t的新元素。返回指向新新增的元素的迭代器。

c.insert(p,n,t)

在迭代器p所指向的元素前面插入n個值為t的新元素。返回void型別

c.insert(p,b,e)

在迭代器p所指向的元素前面插入由迭代器b和e標記的範圍內的元素。返回void型別

注意:新增元素可能會是迭代器失效。

不要儲存end操作返回的迭代器,因為任何新增或者刪除deque和vector容器內元素都會使這個迭代器失效。

容器大小的操作 操作

含義c.size()

返回容器c中的元素個數,返回型別為c::size_type

c.max_size()

返回容器c可容納的最多元素的個數,返回型別c::size_type

c.empty()

返回標記的容器大小是否為0的bool值

c.resize(n)

調整容器c的長度大小,使其能容納n個元素。如果nc.resize(n,t)

調整容器c的長度大小,使其能容納n個元素,所有新新增的元素值都為t

訪問元素 操作

含義c.back()

返回容器c的最後乙個元素的引用。

c.front()

返回容器c的第乙個元素的引用。

c.[n]

返回下標為n的元素的引用(只適用於vector和deque容器)

c.at(n)

返回下標為n的元素的引用(只適用於vector和deque容器)

使用越界的下標或者呼叫空容器的front或者back函式,都會造成程式嚴重的錯誤。

刪除元素 操作

含義c.erase( p )

刪除迭代器p所指向的元素。返回乙個迭代器,它指向被刪除元素後面的元素。如果p指向容器內的最後乙個元素,則返回迭代器指向容器的超出末端的下乙個位置。

c.erase(b,e)

刪除迭代器b和e所標記的範圍內所有的元素。返回乙個迭代器,它指向被刪除元素段後面的元素。如果e指向容器內的最後乙個元素,則返回迭代器指向容器的超出末端的下乙個位置。

c.clear()

刪除容器c內的所有元素。返回void型別

c.pop_back()

刪除容器c的最後乙個元素。返回void型別

c.pop_front()

刪除容器c的第乙個元素。返回void型別(只適用於list和deque型別)

erase、pop_front和pop_back函式使指向被刪除元素的所有迭代器失效。對於vector容器,指向刪除點後面的元素的迭代器通常也會失效。而對於deque容器,如果刪除時不包含第乙個元素和最後乙個元素,那麼該deque容器相關的所有迭代器都會失效。

每日複習筆記

未知數量輸入的解決辦法 利用whlie迴圈 讀入位置數量的輸入 include using namespace std int main cout sum is sum 注意 一般windows系統的檔案結束符是ctrl z unix系統中是 control d。標頭檔案的小細節 標準庫的標頭檔案用...

每日複習筆記5 3

關聯容器支援通過鍵來高效的查詢和讀取元素。有兩種基本的關聯容器型別 map和set。pair型別 表示式功能 pairp1 建立乙個空的pair物件,它的兩個元素分別是ti和t2型別的,採用值初始化。pairp1 v1,v2 建立乙個pair物件,它的兩個元素分別是ti和t2型別的,first成員初...

每日複習筆記4 25

函式的定義 函式由函式名以及一組運算元型別唯一的表示。函式體是乙個作用域 函式體是乙個語句塊,定義了函式的具體操作,形成了乙個 新的作用域。可以在函式體內定義變數,這種變數是區域性變數,變數名字只在函式內可見。函式返回型別 函式的返回型別可以是內建型別,類型別或者復合型別 例如引用或者指標 甚至是v...