Vector ======== Introduction -------- Vector是c++中陣列的替代型態,可以自主控制需要的記憶體。 Vector可以任意增加陣列長度及資料的數量,也可任意插入或刪除指定位置的資料。 基礎運用 -------- 使用vector需要加入標頭檔vector ex: ```c #include ``` 宣告新vector的語法 ```c vector vector_name(amount,element); ``` ex: ```c vector acm(3,4); vector csie(5);//未指定數字會補 0 ``` 嘗試印出兩vector內容 output: ```c acm : 4 4 4 csie : 0 0 0 0 0 ``` 也可以直接建立空白的vector ex: ```c vector acm; ``` 此外也可以使用陣列為基礎來建構vector,將陣列原有的資料放入vector中 如此的指定方式,需要提供的參數為起始位址與結束位址 ex: ```c int array[5]={1,2,3,4,5}; vector ncku(array,array+5);//1 2 3 4 5 vector csie(array+1,array+4);//2 3 4 ``` Member functions ---------------------------- ### operator[] 中括號[]的用法與array相同,指的是vector中的指定項元素 ```c int array[5]={1,2,3,4,5}; vector ncku(array,array+5); cout << ncku[2] << endl; ``` output: ```c 3 ``` ### iterator迭代器/.begin() /.end() 若要讀取資料的話也可以定義iterator來進行進一步的操作 ```c vector ::iterator it; vector ::iterator it2; ``` .begin()會將iterator指向第一筆資料 .end()會將iterator指向最後一筆資料的下一個位子 完整程式碼範例 ex: ```c #include #include using namespace std; vector acm(3,4); vector::iterator it; void vector_print(vector v){ cout << "The vector contains these elements : " << endl; for(it = v.begin(); it != v.end(); it++){ cout << *it << " "; }//prints the vector from the first element to the last element cout << endl; } int main(){ int n; vector_print(acm); return 0; } ``` Output: ```c The vector contains these elements : 4 4 4 ``` ### .push_back()/.pop_back() .push_back()會將小括號內的資料加入vector尾端 而.pop_back則會刪去最後面的資料 ex: ```c char ar[5]={'a','b','c','d','e'}; vector csie(ar,ar+5); vector::iterator it; vector_print(csie); csie.push_back('f'); vector_print(csie); csie.push_back('g'); vector_print(csie); csie.pop_back(); vector_print(csie); csie.pop_back(); vector_print(csie); ``` output: ```c a b c d e a b c d e f a b c d e f g a b c d e f a b c d e ``` ### .size() .size會回傳vector大小 ```c vector acm(5); cout << acm.size() << endl; ``` output: ```c 5 ``` ### .clear() / .empty() .clear()會刪除vector內的所有元素,clear後的vector大小會為0 而.empty()則會測試vector是否為空的,是則回傳ture,否則回傳false 注意:empty只會測試是否為空,並不會清空vector內資料 ```c vector acm; acm.push_back(100); acm.push_back(200); acm.push_back(300); cout << "the original size is : " << acm.size() << endl; acm.clear(); cout << "after cleaning, the size is : " << acm.size() << endl; if(acm.empty()==true){ cout << "the vector is empty!" << endl; } ``` output: ```c the original size is : 3 after cleaning, the size is : 0 the vector is empty! ``` ### .insert() .insert()可以指定元素插入vector的位置與數量 有三種常見的插入方式 1.插入單個數字 ```c vector.insert(position,element); ``` 2.填入多個相同數字 ```c vector.insert(position,amount,element); ``` 3.將另一獨立vector或陣列插入舊有vector ```c vector.insert(position,input start,input end); ``` 完整程式碼範例 ex: ```c #include #include using namespace std; vector::iterator it; void vector_print(vector v){ for(it = v.begin(); it != v.end(); it++){ cout << *it << " "; } cout << endl; } int main(){ vector ncku; ncku.push_back(108); it=ncku.begin(); ncku.insert(it,107); vector_print(ncku); ncku.insert(ncku.begin(),2,106); vector_print(ncku); vector csie(3,105); ncku.insert(ncku.begin(),csie.begin()+1,csie.end()); vector_print(ncku); int array[]={108,109,120}; it=ncku.end(); ncku.insert(it,array,array+3); vector_print(ncku); return 0; } ``` output: ```c 107 108 106 106 107 108 105 105 106 106 107 108 105 105 106 106 107 108 108 109 120 ``` ### .erase() .erase()可以刪除單個元素,也可以刪除給定範圍內的所有資料 用法分別為 ```c vector.erase(position); ``` 以及 ```c vector.erase(erase start,erase end); ``` ex: ```c int array[]={0,1,2,3,4,5,6,7,8,9,10}; vector csie(array,array+11); csie.erase(csie.begin()+6);//0 1 2 3 4 5 7 8 9 10 csie.erase(csie.begin()+6,csie.end());//0 1 2 3 4 5 ``` ### .assign() 使用assign對vector賦值的話會將vector內原有的所有資料覆蓋 assign的用法與宣告時類似,但沒有只給一個參數(amount)的用法 ```c vector.assign(amount,element); vector.assign(input array start,input array end); ``` ex: ```c vector ncku(3,2016);//2016 2016 2016 ncku.assign(5,100);//100 100 100 100 100 int array[5]={1,2,3,4,5}; ncku.assign(array,array+5);//1 2 3 4 5 ```