使用標準模板庫中的vector時需要注意的地方

2021-04-01 16:28:47 字數 2464 閱讀 9913

stl中的vector用起來很方便,但是對其正確使用是使用方便的前提。

根據c++的發明者bjarne stroustrup的忠告自我總結一下

vector的原型vector> class std::vector

vector提供的資源

a  vector是給程式設計師提供容器,可以容納其模板類的陣列;

b  vector的可以動態分配記憶體以適應其元素個數的改變;

c  vector提供了對其元素的高效的隨機訪問效能;

d  vector裡的元素是其源物件的副本

1 決不要另行定義標準庫的功能

2 stl中的每個容器(包括vector)都提供了乙個名為iterator

的迭代器用於對元素的訪問,這個迭代器可以用於修改元素,另外還提供了乙個const_iterator的迭代器用於不加修改的元素的訪問。迭代器可以看作是指向容器元素的指標,因此,除非另有原因,應該使用更安全的const_iterator

迭代器

3 訪問元素有兩種方法,操作符號[ ]

和函式at( )[ ]不帶檢查而at( )要做範圍檢查並在下標越界時丟擲out_of_range異常。對於已經做過範圍檢查的訪問,可以用[ ]得到高效率的訪問,若不清楚範圍,則最好用at( )

。3 建構函式析構函式和複製操作:

3.1 建構函式:建構函式通過使用模板型別的預設建構函式建立乙個物件副本;

注意:靜態物件(全域性物件,名字空間物件,區域性靜態物件)將自動初始化為適當的0,而區域性物件和在自由儲存區中建立的物件(自動物件,動態物件,堆物件)不會做自動初始化。

在某個型別沒有預設建構函式時,在沒有顯式為每個元素提供值的情況下,我們就不能建立以這個型別為元素的向量。

預設建構函式就是呼叫時不必提供引數的建構函式,如果使用者自己宣告了乙個預設建構函式,編譯器就會使用它,否則,如果有必要,而且使用者沒有宣告其它的建構函式,編譯器就會設法去生成乙個。編譯器生成的預設建構函式將隱式為類型別的成員和它的基類呼叫有關的預設建構函式。

由於複製建構函式和複製賦值運算子拷貝vector的所有元素,對於有很多元素的vector而言,這種操作的代價可能很高,所以vector通常採用引用傳遞。即使用void fun(vector&)和void fun(const vecotr)不使用void fun(vector)這種做法。

賦值函式assign():

對於多引數建構函式,vector提供了一些assign函式以實現其功能,如果要採用乙個預設值或者需要提供乙個範圍中的一些值時,就需要採用assign()函式,如:

class book

void f(vector&vn, vector&vc, vector&vb, list&lb)

注意:賦值將完全改變乙個向量裡的全部元素,所有的老元素都被刪除,新元素插入,在賦值過後,vector的大小就是所賦值的新元素的個數。使用assign()函式可以用任何向量型別的序列對vector進行初始化或者類似的以任何這樣的序列給向量賦值。重要的是,我們並沒有引進大量的建構函式或者轉換函式。

assign所做的事情也可以間接完成,可以首先建立乙個適當的vector,而後再給它賦值

void f(vectorvh, list&lb)

但是,這樣做既醜陋又低效。

3.2 析構函式:vector將使用其型別的析構函式,因此,正確的析構函式是使用vector工作良好的乙個前提條件。

4 堆疊操作:vector經常用來做堆疊,因此引入了 push_back()和pop_back(),back()等函式,但pop_back並不返回值。

5 表操作: insert()

6 使用迭代器型別而不要採用索引元素的指標

7 多用容器和push_back()或resize(),少用陣列和realloc(),

resize(n, val)  //將vector的尺寸改變為容納n個元素,增加的元素用val初始化:

reserve(n) //做出總數為n個元素的空位,不初始化。

8當vector改變大小後,不要使用指向其中的迭代器。其原因是vector在做resize等操作時元素可能會因記憶體分配而被移動到別的地方,從而使得你儲存的那些指標是非法的。

9 利用reserve()避免迭代器非法。在需要的時候,利用reserve()以使得執**況更容易預期。

10 若能預期,在vector建立時分配大小

標準模板庫(STL)使用 vector

或許你已經把 c 作為主要的程式語言用來解決 topcoder 上的問題。這意味著你已經簡單使用過了 stl,因為陣列和字串都是作為 stl 物件傳遞給函式。也許你已經注意到了,很多程式設計師寫 比你快得多,也更簡潔。或許你還不是但想成為一名 c 程式猿,因為這種程式語言功能很強大還有豐富的庫 也許...

標準庫vector模板

vector是同一種型別的物件的集合,每個物件都有乙個對應的整數索引值。vector成為容器,因為它能包含其他物件,所有物件必須是同一種型別。include using std vector 注意 vector是一種類模板,不是一種資料型別,它可以來定義任意多種資料型別。如vector和vector...

標準模板庫中的向量 vector

c 資料結構與演算法 第4版 adam drozdek 著 徐丹 吳偉敏 清華大學出版社 標頭檔案 include 向量是最簡單的stl容器,其資料結構與陣列類似,佔據著乙個連續的記憶體塊。由於記憶體位置是連續的,所以向量中的元素可以隨機訪問,訪問向量中任何乙個元素的時間也是固定的。儲存空間的管理是...