本文基於鄧俊輝編著《數據結構(C++語言版)(第3版)》、《C++ Primer(第5版)》以及網上的相關博文而寫,博主水平有限,若有不妥處,歡迎指出。
一、數組
C++中數組是一種內置的數據類型。
數組是存放類型相同的對象的容器,數組的大小確定不變,不能隨意向數組中增加元素。
1、定義和初始化內置數組
(1)數組的大小不變,(a[d],d為數組的維度),數組的維度必須是一個常量表達式。定義數組的時,必須指定數組的類型和大小。
(2)初始化時,允許不指明數組的維度,不指明維度,則編譯器根據數組初始值的大小推測出維度;若指定維度,則初始值的個數要小於等於維度,當小於時,不足的部分為0(其實還是等於維度)。
1 int a[]={1,2,3}; //數組a的大小為3; 2 int a[5]={1,2,3}; //等價於{1,2,3,0,0},大小為5 3 int a[5]={1,2,3,4,5,6}; //錯誤,初始值過多
還有一種特殊的情況:字符數組。當用字符串字面值去初始化數組時,要注意字符串字面值的后面還有一個空字符。也就是說,數組的大小要等於字面值的大小加1。
特別注意:不允許拷貝和賦值------不能將數組的內容拷貝給其他數組作為初始值,也不能用數組為其他數組賦值。
1 int a[]={1,2,3}; 2 int a2[]=a; //錯誤 3 a2=a; //錯誤
2、訪問數組元素
數組的索引是從0開始,如:包含10個元素的數組a,其索引是從0到9而非1到10,若是a[10]則下標越界。
另外,使用數組下標時,其類型是size_t,在頭文件cstddef中。
二、向量
C++中vector為類模板。
vector是類型相同的對象的容器,vector的大小可以變化,可以向數組中增加元素。
1、定義和初始化vector對象
初始化的方式比較多,有如下幾種:
1 vector<T> v1; //v1為空,執行默認初始化 2 vector<T> v2(v1); //v2中包含v1所有元素的副本 3 vector<T> v2=v1; //等價於v2(v1) 4 vector<T> v3(n,val); //v3中包含n個重復元素,每個元素的值都是val 5 vector<T> v4(n); //v4包含n個重復執行了值初始化的對象 6 vector<T> v5{a,b,c...}; //包含初始化元素個數,每個元素被對應的賦予相應的值 7 vector<T> v5={a,b,c...}; //等價v5{a,b,c...}
注意事項:
(1)vector<T> v1,只用默認初始化時,不能通過下標進行添加元素。也就是說,當你將v1初始化為空時,假如你想向v1中添加10個元素,不能通過v1[2]=3;等形式添加,因為,別人為空,壓根不知道v1[2]是什么東東。
(2)注意vector<T> v4(n)和vector<T> v4{n}的區別。前者說的是,v4中有n個相同的元素,至於值為多少要看相應對象的初始化值;而后者,則是說v4中只有一個元素,其值為n。
(3)不能使用包含着多個值的括號去初始化vector對象。注意和或括號的區別。
1 vector<int> intV(1,2,3); //錯誤
2、向vector對象中添加對象
利用vector的成員函數push_back向其中添加對象:
1 vector<int> v; 2 for(int i=0;i !=100;++i) 3 { 4 v.push_back(i); 5 }
注意:
若是循環體內包含想vector對象添加元素的語句,則不能使用范圍for循環。因為范圍for語句不應改變其所遍歷序列的額大小。原因如下:
1 vector<int> v={1,2,3,4,5,6,7,8,9}; 2 for(auto &r: v) 3 { 4 r*=2; 5 } 6 7 等價於 8 for(auto beg=v.begin(),end=v.end();beg !=end;++beg) 9 { 10 auto &r=*beg; 11 r*=2; 12 }
即在范圍for語句中,預存了end()的值,一旦在序列中添加(刪除)元素,end函數的值就可能變的無效了。
3、vector的擴容、插入和刪除
(1)擴容
vector的底層數據結構時數組。
當vector中的可用空間耗盡時,就要動態第擴大內部數組的容量。直接在原有物理空間的基礎上追加空間?這不現實。數組特定的地址方式要求,物理空間必須地址連續,而我們無法保證其尾部總是預留了足夠空間可供拓展。一種方法是,申請一個容量更打的數組,並將原數組中的成員都搬遷至新空間,再在其后方進行插入操作。新數組的地址由OS分配,與原數據區沒有直接的關系。新數組的容量總是取作原數組的兩倍。
(2)插入和刪除
插入給定值的過程是,先找到要插入的位置,然后將這個位置(包括這個位置)的元素向后整體移動一位,然后將該位置的元素復制為給定值。刪除過程則是將該位置以后的所有元素整體前移一位。
(2)vector的size和capacity
size指vector容器當前擁有的元素個數,capacity指容器在必須分配新存儲空間之前可以存儲的元素總數,capacity總是大於或等於size的。
三、數組與vector的對比
1、內存中的位置
C++中數組為內置的數據類型,存放在棧中,其內存的分配和釋放完全由系統自動完成;vector,存放在堆中,由STL庫中程序負責內存的分配和釋放,使用方便。
2、大小能否變化
數組的大小在初始化后就固定不變,而vector可以通過push_back或pop等操作進行變化。
3、初始化
數組不能將數組的內容拷貝給其他數組作為初始值,也不能用數組為其他數組賦值;而向量可以。
4、執行效率
數組>vector向量。主要原因是vector的擴容過程要消耗大量的時間。
Ref:
http://www.cnblogs.com/chhuach2005/p/3627011.html
