C++中數組和vector


本文基於鄧俊輝編著《數據結構(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM