第九章 順序容器

2022-08-13 15:03:22 字數 3095 閱讀 1860

char *words=

這裡其實是定義了乙個指標陣列.

順序容器的元素排列次序與元素值無關,而是由元素新增到容器中的次序決定的.

順序容器:vector《支援快速隨機訪問》   list《支援快速插入、刪除》  deque《雙端佇列》

順序容器介面卡  stack 後進先出lifo棧   queue 先進先出fifo佇列.  priority_queue有優先順序管理的佇列.

將乙個容器複製給另乙個容器時,型別必須匹配:容器型別和元素型別都必須相同.

接受容器大小做形參的建構函式只適用於順序容器,而關聯容器不支援這種初始化

也就是說  listilist(10);或者   vectorgood(5,"hao");

容器內元素的型別必須滿足以下兩個約束:

1.元素型別必須支援賦值運算

2.元素型別的物件必須可以複製.

由於引用不支援一般意義的賦值運算,因此沒有元素是引用型別的容器

io庫型別不支援複製或者賦值。因此不能建立存放io型別物件的容器.

1.容器操作的r特殊要求::一些容器操作對元素型別還有特殊要求。如果元素型別不支援這些特殊要求,則相關的容器操作就不能執行:我們可以定義該型別的容器,但不能使用某些特定操作。

如:容器儲存類型別的物件,那麼只有當其元素型別提供預設建構函式時,容器才能使用這種建構函式。儘管有一些類沒有提供預設建構函式,但是大多數類型別都會有。假如類foo沒有預設建構函式,單提供了需要乙個int型形參的建構函式。現在,考慮:

vectorempty;//可以.不需要預設建構函式.

vectorbad(10)//錯誤,沒有預設建構函式

vectorok(10,1)//可以.每個元素初始化為1

vector和deque容器的迭代器提供額外的運算.

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

關係操作符只適用於vector和deque容器,這是因為只有這兩種容器為其元素提供快速、隨機的訪問。它們確保可根據元素位置直接有效地訪問指定的容器元素。這兩種容器都支援通過元素位置實現的隨機訪問,因此它們的迭代器可以有效地實現算數和關係運算。

迭代器範圍:這兩個迭代器分別指向同乙個容器中的兩個元素或超出末端的下一位置。一般注意第二個迭代器是指向最後乙個元素的下乙個位置。【first,last)  左閉合區間:這樣定義可以很明顯的理解到,1,當first與last相等時,迭代器範圍為空;2.當first與last不相等時,迭代器範圍內至少有乙個元素,而且first指向該區間中的第乙個元素。此外,通過若干次自增運算可以使first的值不斷增大,直到first==last未知。

這就提供了一種做法

while(first!=last)

對形成迭代器範圍的迭代器的要求:

1.它們指向同乙個容器中的元素或者超出末端的下乙個位置。

2.如果這兩個迭代器不等,則對first反覆做自增運算必須能夠到達last。換句話說,在容器中,last絕對不能位於first之前。

注意會使迭代器失效的一些操作,使用迭代器編寫程式時,必須留意哪些操作會使迭代器失效。使用無效迭代器將會導致嚴重的執行時錯誤.

list::iterator  iter;//解釋:將iter宣告為iterator型別, 而iterator是存放在string型別元素的list類成員.

在順序容器中新增元素.

所有順序容器都支援push_back操作,提供在容器尾部插入的乙個元素的功能。

c.push_back(t)  在容器c的尾部新增t的元素

c.push_front(t)  在容器c的前端新增t的元素

c.insert(p,t)在迭代器p所指向的元素前面插入值為t的新元素.返回指向新新增元素的迭代器。

c.insert(p,n,t)在迭代器p所指向的元素前面插入n個值為t的新元素。

c.insert(p,b,e)在迭代器p所指向的元素前面插入由迭代器b和e標記的範圍內的元素。

容器元素都是副本.

容器大小的操作:

c.size()  返回容器c中的元素的個數.返回型別為c::size_type;

c.max_size() 返回容器c可容納的最多元素個數,返回型別為c::size_type;

c.empty() 返回標記容器大小是否為0的布林值.

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

c.resize(n,t) 調整容器c的大小,使其能容納n個元素。則所有新新增的元素值都是t.

刪除元素

c.erase(p)  刪除迭代器p所指向的元素,翻乙個迭代器,它指向被刪除元素的後面元素。如果p指向容器內的最後乙個元素,則返回的迭代器指向容器的超出末端的下乙個位置。如果p本身就是指向超出末端的下一位置的迭代器,則該函式未定義.

c.erase(b,e) 刪除迭代器b和e所標記的範圍內的所有元素,返回乙個迭代器,它指向被刪除元素段後的元素。

c.clear(0 刪除容器c內的所有元素。

c.popback() 刪除容器c內的最後乙個元素。

c.pop_front() 刪除容器c的第乙個元素.//vector容器不支援此操作.

刪除容器內所有元素:

a.clear();或者a.erase(a.begin(),a.end());

assign

assign操作首先刪除容器中的所有元素,然後將其引數所指定的新元素插入到容器中。與複製容器元素的建構函式一樣,如果兩個容器型別相同,其元素型別也相同,就可以使用賦值操作符(=)將乙個容器賦值給另乙個容器.

如:slist1.assign(slist2.begin(),slist2.end()).

assign運算的第二個版本需要乙個整型數值和乙個元素值作為引數,它將容器重置為儲存指定數量的元素,並且每個元素的值都是指定值:

slist1.assign(10,"hiya");

第九章 順序容器

1 容器必須支援的2種操作,這種型別才能作為容器的元素 一是元素型別支援賦值操作,而是元素型別支援物件複製操作 2 操作特殊需求,例如容器元素型別為類型別,該類只提供了單值初始化建構函式,則不能用vec n 的操作了,因為無法給類型別初始化,這是由於沒有預設建構函式導致的。但是可以vec n,1 3...

C primer 第九章順序容器!

標準庫定義了3種順序容器 vector支援隨機訪問,list支援快速插入刪除,deque雙端佇列。他們的差別在於訪問元素的方式,以及新增或刪除元素操作的執行代價。1.容器元素的初始化 預設的建構函式 listilist list容器,裡面內容是int型別的內容 dequeitems 空容器deque...

C Primer 第九章 順序容器

接受容器大小引數的順序容器建構函式使用了元素的預設建構函式 forward lis迭代器不支援 運算子 使用迭代器引數來拷貝乙個範圍時,就不要求容器型別相同了 array型別可以進行拷貝和賦值,但是要求元素型別和大小一樣 array型別不支援assign,也不允許用花括號的值列表進行賦值 swap一...