C 動態順序容器vector

2021-10-23 14:31:09 字數 4278 閱讀 3767

c++ 動態順序容器vector

1.vector簡介

vector是c++標準模板庫中的部分內容,是模板類函式。之所以稱它為容器,是因為它能容納多種資料型別的物件。vector是順序容器,容器中的元素按照嚴格的線性順序排列,根據位置下標來儲存和訪問元素。同時它也是動態陣列,空間運用比較靈活,隨著元素加入,內部機制可以動態的增加或者減少元素,記憶體管理可以自動完成。

在程式裡使用vector時要加入標頭檔案

#include

2.vector的建構函式

vector有4種建構函式:

第一種vector( const allocator& = allocator() )

說明:預設的建構函式,allocator是預設引數,使用的時候不用傳引數。建立乙個空的vector,沒有分配任何空間,分配記憶體之前用陣列下標或者迭代器訪問陣列將會使程式崩潰;可用push_back函式在尾部動態的插入元素,或者用resize函式分配空間。

使用

vector<

int> a;

//建立乙個int型別的動態陣列a

vector b;

//建立乙個string型別的動態陣列b

a[0]

=5;//程式崩潰,因為a是空的,沒有分配記憶體

b.push_back

("mark");

//在陣列b尾部插入字串mark

a.resize(10

);//為a元素分配10個元素的記憶體空間

a[0]

=5;//程式正常執行,因為a.resize(10)已經為其分配了10個元素大小的空間

第二種vector( size_type n,constt& value = t(), const allocator& = allocator() );

說明:n是元素個數,value是初始值,可預設,預設的時候預設值為0。呼叫該建構函式需要至少傳乙個引數,只傳乙個引數時會給陣列開闢大小為n的空間,同時將其初始化為0。傳兩個引數時會給陣列開闢大小為n的空間,每個元素的值初始化為value。

使用

vector<

int>a(

5);//建立乙個記憶體大小為5個int型別元素的陣列,並將每個元素初始化為0

vector<

int>a(

5,3)

//建立乙個記憶體大小為5個int型別元素的陣列,並將每個元素初始化為3

第三種template vector ( inputiterator first, inputiterator last, const allocator& = allocator() );

說明:呼叫該建構函式時需要傳入兩個引數,第乙個引數是一段序列的起始位址或者是迭代器,第二個引數是一段序列的結束位址或者迭代器。該建構函式會根據這一段序列來建立乙個vector陣列,並使用指定序列裡的內容進行初始化。

使用

vector<

int> a;

for(

int i=

0;i<

5;i++

)int arr[4]

=;vector<

int>

b(a.

begin()

,a.end()

);//用陣列a的起始迭代器和終止迭代器給b賦值,此時b裡有5個元素,元素內容與a一樣

vector<

int>

b(arr+

1,arra+3)

;//用陣列arr某段序列的起始位址和終止位址給b賦值,此時b裡有2個元素,分別是1,2。

:迭代器是一種指標,指向的是某元素的位址。實際上這兩個引數傳遞的都是位址,只要有了起始位址和終止位址,該建構函式在實現時就能根據位址取出序列元素的值給新的vector陣列賦值。

第四種vector ( const vector& x );

說明:這是拷貝建構函式,根據乙個vector物件a構建乙個新的vector物件b,b的初始值與a完全一致。此時a和b用的是不同的位址空間。

使用: vector c(a); //將vector陣列a拷貝給vector陣列c,c中的元素與a中的元素值相同

:拷貝有深拷貝與淺拷貝兩種。淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標,即元素值相同,位址空間不同。在使用乙個vector物件進行值傳遞傳參時,使用的是深拷貝,也就是說形參是實參的乙份拷貝,形參的值發生變化不會影響實參的值。

參考:3.vector迭代器

除了使用下標來訪問vector物件的元素外,標準庫還提供了訪問元素的方法:使用迭代器。所有的容器都支援迭代器,每種容器都定義了自己的迭代器型別,迭代器是特殊的指標,是一種檢查容器內元素並遍歷元素的資料型別。

vector<

int>

::iterator iter;

//建立乙個iter迭代器

vector<

int> a;

iter=a.

begin()

;返回乙個迭代器,此時iter指向a中的第乙個元素

iter=a.

end();

返回乙個迭代器,此時iter不指向容器中的任何乙個元素,而是指向容器的最後元素的下一位置,稱為超出末端迭代器

利用迭代器遍歷元素:

for

(int i=

0;i<

6;i++

)for

(iter=a.

begin()

;iter!=a.

end();

++iter)

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

// 所有的容器的迭代器都定義了!=和==方法;而絕大部份迭代器沒有《方法,所以不能用iter

每種容器還定義了一種名為const_iterator的型別。該型別的迭代器只能讀取容器中的元素,不能用於改變其值。之前的例子中,普通的迭代器可以對容器中的元素進行引用並修改,而const_iterator型別的迭代器只能用於讀不能進行重寫。

vector<

int>

::const_iterator iter1;

//建立乙個const_iterator型別的迭代器iter1

iter1=a.

begin()

+3;//指向a中第四個元素

cout<<

*iter1

*iter1=

0; //會報錯,不能進行寫操作

4.vector的常用成員函式

1.push_back 在陣列的最後新增乙個資料,在尾部增刪元素具有較佳效能

2.pop_back 去掉陣列的最後乙個資料

3.at 得到編號位置的資料

4.begin 得到陣列頭的指標

5.end 得到陣列的最後乙個單元+1的指標

6.front 得到陣列頭的引用

7.back 得到陣列的最後乙個單元的引用

8.max_size 得到vector最大可以是多大

9.capacity 當前vector分配的大小

10.size 返回值是size_type型別,表示陣列有多少個元素

11.resize 給vector陣列分配一定大小的記憶體

12.reserve 表示容器預留空間,並不真正的分配記憶體

13.erase 刪除指標指向的元素

14.clear 清空當前的vector,但不釋放記憶體

15.rbegin 將vector反轉後的開始指標返回(其實就是原來的end-1)

16.rend 將vector反轉構的結束指標返回(其實就是原來的begin-1)

17.empty 判斷vector是否為空

順序容器 vector

一 底層實現 vector就是動態陣列.它也是在堆中分配記憶體,元素連續存放,有保留記憶體,如果減少大小後,記憶體也不會釋放.如果新值 當前大小時才會再分配記憶體.它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和...

順序容器vector

vector的關鍵在於其對大小的控制以及重新配置時的資料搬移效率。由於vector維護的是乙個連續線性空間,所以不論元素類別,普通指標都可以作為vector的迭代器而滿足必要條件,包括隨機訪問 操作符 等操作行為。vector提供的是random access iterators。typedef v...

順序容器 vector

vector與array非常相似,唯一的區別在於靈活性,陣列是靜態空間,一旦定義就不能改變,變大變小都需要客戶端自己重新配置新的空間,然後將元素從舊址搬到新址,再把原來的空間還給系統。vector是動態空間,隨著元素的加入,他的內部機制會自行擴充空間以容納新元素。1.vector的底層實現 vect...