2014年8月6日 星期三

[ C++ Gossip ] 進階型態 : 向量 - 陣列型式(Array idiom) vector

來源自 這裡
Preface:
您可以使用 vector 來替代陣列,並使用陣列型式(Array idiom)的方式來操作vector,要使用 vector,必須含入vector表頭檔:
陣列型式(Array idiom) vector :
要建立 vector 型態的物件(Object),您必須提供元素型態與長度資訊,例如下例中建立 int 元素的 vector,並擁有10個元素:
  1. vector<int> ivector(10);  
您可以模彷陣列中存取元素的方式來存取 vector 的元素,使用下標(Subscript)運算子並指定索引來取得指定的元素,例如:
  1. #include   
  2. #include   
  3. using namespace std;   
  4.   
  5. int main() {   
  6.     vector<int> ivector(10);  
  7.   
  8.     for(int i = 0; i < ivector.size(); i++) {  
  9.         ivector[i] = i;  
  10.     }  
  11.   
  12.     for(int i = 0; i < ivector.size(); i++) {  
  13.         cout << ivector[i] << " ";  
  14.     }  
  15.     cout << endl;  
  16.   
  17.     return 0;   
  18. }  
執行結果:


與陣列型態不同的是,vector 記得自己的長度資訊,您可以使用 size() 查詢 vector 的元素長度,或是使用empty() 測試長度是否為0.

當您宣告 vector 物件時,所有的元素值會有與型態相應的初始值,例如算術相關型態會被初始為0,指標型態初始為0(表示不指向任何位址),如果您打算 將所有元素初始為指定的值,則可以如下:
  1. vector<int> ivector(105);  
上例中將宣告有10個元素的 vector,並將所有的元素值初始為5.

如果您願意,您可以使用一個陣列來作為建構vector的引數(Argument),如此建構出來的 vector 會擁有陣列所指定的元素初值,在這之前, 您要先知道,宣告一個陣列時,陣列名稱所儲存的是第一個元素在記憶體中的位址值,對該位址值加一,表示移至下一個元素,當使用陣列來建構 vector 時, 要指定的是元素的起始位址與最後一個元素的下一個位址,例如以整個陣列來建構vector的話,可以這麼撰寫:
  1. #include   
  2. #include   
  3. using namespace std;   
  4.   
  5. int main() {   
  6.     int iarr[] = {12345};  
  7.   
  8.     vector<int> ivector(iarr, iarr + 5);  
  9.   
  10.     for(int i = 0; i < ivector.size(); i++) {  
  11.         cout << ivector[i] << " ";  
  12.     }  
  13.     cout << endl;  
  14.   
  15.     return 0;   
  16. }  
執行結果:


如果打算只使用陣列中的某個範圍來建構 vector,例如複製索引1到3的元素,則可以如下:
  1. #include   
  2. #include   
  3. using namespace std;   
  4.   
  5. int main() {   
  6.     int iarr[] = {12345};  
  7.   
  8.     vector<int> ivector(iarr + 1, iarr + 4);  
  9.   
  10.     for(int i = 0; i < ivector.size(); i++) {  
  11.         cout << ivector[i] << " ";  
  12.     }  
  13.     cout << endl;  
  14.   
  15.     return 0;   
  16. }  
vector可以使用另一個vector作為引數來建構,例如以ivector1作為引數來建構ivector2:
  1. vector<int> ivector1(51);  
  2. vector<int> ivector2(ivector1);  
vector 可以使用=直接指定給另一個 vector,這會將 vector 的值複製給被指定的 vector,例如:
  1. #include   
  2. #include   
  3. using namespace std;   
  4.   
  5. int main() {   
  6.     vector<int> ivector1(51);  
  7.     vector<int> ivector2; // 定義一個空的vector  
  8.   
  9.     ivector2 = ivector1;  
  10.   
  11.     for(int i = 0; i < ivector2.size(); i++) {  
  12.         cout << ivector2[i] << " ";  
  13.     }  
  14.     cout << endl;  
  15.   
  16.     ivector2[0] = 2;  
  17.   
  18.     for(int i = 0; i < ivector2.size(); i++) {  
  19.         cout << ivector2[i] << " ";  
  20.     }  
  21.     cout << endl;  
  22.   
  23.     for(int i = 0; i < ivector1.size(); i++) {  
  24.         cout << ivector1[i] << " ";  
  25.     }  
  26.     cout << endl;  
  27.   
  28.     return 0;   
  29. }  
執行結果:


由於指定時是將值一一複製加入目標 vector,所以您改變目標 vector 的值,並不會影響原來的 vector


Supplement:
Cplusplus - vector
Vectors are sequence containers representing arrays that can change in size...


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...