stl之順序容器學習筆記3

2021-05-23 05:31:17 字數 1983 閱讀 6232

vector容器的自增長

概述vector物件為了支援快速隨機的訪問,將元素以連續的方式存放(與陣列相同)。

當我們向vector中新增乙個元素時,如果容器已經沒有空間容納新的元素,此時,由於元素必須連續存放以實現快速索引,所以不能在記憶體中隨便找個地方來儲存這個元素。

於是,vector必須重新分配儲存空間,存放在舊儲存空間的元素需要複製到新的儲存空間中,接著插入新元素,最後撤銷舊的儲存空間。如果vector每次新增新元素時,都要經過這些步驟的話,則其效能會非常差。

而list基本上不會有這樣的顧慮,因為其在記憶體中是分散儲存的,也就是鍊錶的形式。

為了解決以上問題,stl的設計者,使用了一種方法,可以大大增加效率。具體就是加入了一種預先分配多一些空間的機制。比如:ivec起初是個空容器,插入乙個元素後,這時ivec被分配的記憶體空間足以容納50個元素,而接下來插入的49個元素,都無需重新分配記憶體。直到插入第51個元素,再分配一次記憶體,這時候ivec被分配的記憶體足以容納100個元素。如此反覆。事實證明,此種機制帶來了顯著的效率提公升。

capcity和reserve函式

這是vector提供的兩個成員函式。這兩個函式用來為程式設計師提供介面,以用來操作記憶體分配策略。

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

reserve:用來設定vector容器應該預留多少個元素的儲存空間。

注:容量capacity和size的概念完全不同,capacity是容器的容量,即在必須重新擴大記憶體空間之前所能容納的元素總數。而size則是當前容器中元素的個數。如ivec起初是乙個空容器,插入乙個元素後,size就為1,而capacity就為49.

考慮以下的例子:

vectorivec;

cout <<"ivec:size:" ivec.push_back(ix);

cout <<"ivec:size:" ivec:size:0

ivec:capacity:0

ivec:size:24

ivec:capacity:32

可見,在ivec為空容器的時候,size為0,編譯器將capacity也置為0;當在容器中插入1個元素後,重分配了空間,置capacity為50;24個元素插入完畢後,capacity為32,size為24。

容器的選用

一般來說,選用容器需考慮以下兩個因素:

1、在容器的中新增或刪除元素的代價。

2、在容器中隨機訪問。

程式使用這些操作的多寡,將決定選擇哪種容器。

vector和deque提供了對元素的快速隨機訪問,但付出的代價是,在容器的任意位置插入或刪除元素,會比在首部或尾部操作的開銷更大。一切緣由於元素的連續存放(陣列形式)。

list在任何位置都能快速的插入和刪除元素,但付出的代價是,元素的隨機訪問開銷較大。一切緣由於元素的非連續存放(鍊錶形式)。

一些選擇容器的法則:

1、如果程式要求隨機訪問元素,則應使用vector或deque容器。

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

3、如果程式要求在容器首部或尾部插入元素,則應採用deque容器。

4、如果只需在讀取資料時在容器中插入元素,插入完畢後需要隨機訪問,則可考慮在讀取時將元素讀入到list中,接著對list進行排序,使其適合順序訪問,最後將排序後的list複製到乙個vector中。

5、如果程式既要隨機訪問又必須在容器中插入刪除元素,則應該取決於這兩種操作的多寡頻率。如隨機訪問頻率高,則選擇vector或deque,反之選擇list。

容器介面卡

stl提供了三種容器介面卡,所謂容器介面卡,就是按一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現。如stack介面卡,可以讓任何一種順序容器以棧的方式工作(先進後出)。

1、stack棧介面卡:嚴格的先進後出(壓棧出棧)

2、queue佇列介面卡:嚴格的先進先出(隊尾進,隊頭出)

3、priority_queue優先順序佇列介面卡:可以設定元素優先順序,將優先順序高的元素放入優先順序低的元素前。(按優先順序進,隊頭出)

stl之順序容器學習筆記1

初窺容器 容納特定型別物件的集合,稱為容器。將單一型別的元素聚集起來成為容器,然後根據位置來儲存和訪問元素,稱為順序容器。順序容器的排列次序,按照元素新增到容器的次序決定。stl定義了三種順序容器 1 vector 2 list 3 deque 他們的差異在於訪問元素的方式,以及做新增 刪除元素時的...

stl容器之順序容器

stl容器分為順序容器和關聯容器 其中順序容器最常用的由vector,list,queue 1.vector vector 向量容器,可以看作變長陣列,長度可根據需要自行變化。使用的標頭檔案 include 定義方式 vector陣列名 vectorar 訪問容器內資料的方式和普通陣列相同,可以用a...

STL學習 順序容器

我以 vector 為例,總結一下 stl順序容器的基本使用。vector 是順序容器,它在很多方面類似於我們通常使用的陣列。但是它比陣列具有很多很好的特性。它使用安全,具有陣列所不具備的自增長的特性,使得 vector 在現代軟體設計中佔據重要地位。本講分五個部分,分別是初始化 迭代器 容器訪問 ...