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/輸出3
*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...