《C primer》 順序容器

2021-06-04 17:01:37 字數 4045 閱讀 3753

順序容器

vector

支援快速隨機訪問

list

支援快速插入/刪除

deque

雙端佇列

順序容器介面卡

stack

後進先出(lifo)棧

queue

先進先出(fifo)棧

priority_queue

有優先順序管理的佇列

容器元素型別必須滿足條件:1.支援賦值運算,2.物件可以賦值

因為容器受容器元素型別的約束,所以可定義元素是是容器型別的容器。

迭代器為標準庫容器型別所提供的運算

*iter

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

iter->mem

對iter進行解引用,獲取指定元素中名為mem的成員。

++iter

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

iter++

--iter

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

iter--

iter1 == iter2

比較兩個迭代器是否相等(或不等)。當兩個迭代器指向同乙個容器中的同一

iter1 != iter2

個元素,或者當他們都指向同乙個容器超出末端的下一位置時,兩迭代器相等

左閉合區間[first, last)

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

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

2.如果這兩個迭代器不相等,則對first反覆做自增運算必須能夠達到last

使迭代器失效的容器操作:一些容器操作會修改容器的內在狀態或移動容器內的元素。這樣的操作會使指向被移動元素的迭代器失效,也可能同時使其他迭代器失效。可能會導致與懸垂指標相同的問題,導致執行錯誤而檢查不出來。

容器定義的型別別名

size_type

無符號整型,足以儲存此容器型別的最大可能容器長度

iterator

此容器型別的迭代器型別

const_iterator

元素的唯讀迭代器型別

reverse_iterator

按逆序定址元素的迭代器

const_reverse_iterator

元素的唯讀(不能寫)逆序迭代器

difference_type

足夠儲存兩個迭代器差值的有符號整型,可為負數

value_type

元素型別

reference

元素的左值型別,是value_type&的同義詞

const_reference

元素的常量左值型別,等效於 const value_type&

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

c.push_back(t)

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

c.push_front(t)

在容器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操作返回的迭代器會導致災難性錯誤。

順序容器的大小可以通過resize調整,可以只指定元素個數,也可以同時指定初始值

訪問順序容器內元素的操作

c.back()

返回容器c的最後乙個元素的引用。如果c為空,則該操作未定義

c.front()

返回容器c的第乙個元素的引用。如果c為空,則該操作未定義

c[n]

返回下標為n的元素的引用,如果n<0或n>=c.size(),則該操作未定義

只適用於vector和deque容器

c.at(n)

返回下標為n的元素的引用。如果下標越界,則該操作未定義

只適用於vector和deque容器

呼叫swap操作可以交換內容

c.assign(b,e)可以重新設定c的元素,將迭代器b和e標記的範圍內所有的元素複製到c中

c.assign(n,t)將c設定為儲存n個t的容器

assign操作首先刪除容器中所有的元素,然後將其引數指定的新元素插入到容器中。

vector容器是連續的儲存空間,而list和deque容器是不連續的。但是vector容器有預留了額外的儲存區用於存放新新增的元素,自增長的速率很高

capacity操作獲取在容器需要分配更多的儲存空間之前能夠儲存的元素總數

reserve操作則告訴vector容器應該預留多少個元素的儲存空間

如何選擇容器:list表示不連續的記憶體區域,可以高效地插入或刪除,vector容器是連續的儲存空間,deque容器有比較複雜的資料結構,從兩端插入或刪除都非常快,在中間插入或刪除代價更高。

一般來說,除非特殊要求,vector都是最好的容器

容器選擇法則:

1.如果程式要求隨機訪問元素,那麼應該選擇vector或deque容器

2.如果程式必須在容器的中間位置插入或刪除元素,則應採用list容器

3.如果程式不是在容器的中間位置,而是在首部或尾部插入或刪除元素,則應採用deque容器

4.如果只需在讀取輸入時在容器的中間位置插入元素,然後需要隨機訪問元素,則可考慮在輸入時將元素讀入到乙個list容器,接著對此容器重新排序,使其適合順序訪問,讓後將其複製到vector容器。

string型別特有的幾種操作(容器型別不支援)

substr函式:可在指定string物件中檢索需要的子串,可以給substr傳遞查詢的起點和乙個計數器

string型別的查詢操作:(args可以定義為乙個字串等)

s.find(args)

在s中查詢args的第一次出現

s.rfind(args)

在s中查詢args的最後一次出現

s.find_first_of(args)

在s中查詢args的任意字元的第一次出現

s.find_last_of(args)

在s中查詢args的任意字元的最後一次出現

s.find_first_not_of(args)

在s中查詢第乙個不屬於args的字元

s.find_last_not_of(args)

在s中查詢最後乙個不屬於args的字元

string型別的比較操作:

s.compare(s2)

比較s和s2

s.compare(pos1,n1,s2)

讓s中從pos下標位置開始的n1個字元與n2做比較

s.compare(pos1,n1,s2,pos2,n2)

讓s中從pos1下標位置開始的n1個字元與s2中從pos2下標位置開始的n2個字元做比較

s.compare(cp)

比較s和cp所指向的以空字串結束的字串

s.compare(pos1,n1,cp)

讓s中從pos1下標位置開始的n1個字元與cp所指向的字串做比較

s.compare(pos1,n1,cp,n2)

讓s中從pos1下標位置開始的n1個字元與cp所指向的前n2字串做比較

容器介面卡:queue,priority_queue和stack。

容器介面卡讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現。

C primer 順序容器

順序容器 vector deque list 介面卡 根據原始容器型別所提供的操作,通過定義新的操作介面,適應基礎的容器型別。容器元素初始化 cc 預設建構函式 cc n n個值初始化,只適用於順序容器,必須給出缺省建構函式 cc n,t n個t只適用於順序容器,可以不給,但要給出 t t 建構函式...

C Primer 筆記 順序容器

將單一元素型別聚集起來成為容器,然後根據位置來儲存和訪問這些元素 vectorivec listslist dequedstr vector 支援快速隨機訪問 list 支援快速插入 刪除 deque 雙端佇列 stack 後進先出 lifo 棧 queue 先進先出 fifo 佇列 priorit...

C primer 順序容器(3)

前幾篇主要是把vector與string放在一起討論,本篇主要是將list與forward list放在一起比較 list故名思義就是列表的意思。首先我們來看看列表與我們之前討論的vector和string有什麼區別。2.正因為這個特點,如果list要訪問容器中的某一元素,就得遍歷整個容器。使得訪問...