###### tags: `C++` `10.basic data structures` :::success 暫定目標APCS觀念5級 實作3級 等考過 再4級 5級 6級 ::: # 1. vector ## 1. 初始化 vector <int> v; ## 1.5 疊代器 iterator 像是游標 指向位置 ![](https://i.imgur.com/xWmaz1N.png) ### 1. 第一個元素位置 v.begin() vector<int> v = {1, 2, 3}; vector<int> ::interator it = v.begin(); //定義疊代器it 為v.begin()位置 cout << *it; //輸出it位置的值 = cout << *v.begin(); ==1== auto it = v.begin(); //自動賦予it資料型態 *it = *it +100; cout << *it; ==101== ### 2. 最後一個元素的下一個位置 v.end() vector<int> ::interator it = v.end()-1; //v.end()-1 = 最後一個元素的位置 cout << *it; ==3== ### 3. 最後一個元素位置 逆向 v.rbegin() vector<int> ::reverse_interator rit = v.rbegin(); //v.rbegin() 為反向疊代器 //指向begin相對位置 = 最後一個元素位置 //向<--移動 位置+1 //向-->移動 位置-1 cout << *rit; ==3== ### 4. 第一個元素的左邊位置 逆向 v.rend() vector<int> ::reverse_interator rit = v.rend()-1; //v.rend()-1 = 第一個元素的位置 cout << *rit; ==1== ### 5. 第一個元素位置 常數 v.cbegin() vector<int> ::const_interator cit = v.cbegin(); //定義常數疊代器cit 為v.cbegin()位置 cout << *cit; ==1== vector<int> ::const_interator cit = v.cbegin(); *cit = *cit +100; //常數疊代器 數值不可改變 會出錯 cout << *cit; ==無法編譯== :::info error: assignment of read-only location 'cit.__gnu_cxx::__normal_iterator<_Iterator, _Container> ::operator*<const int*, std::vector<int> >()'| ::: ![](https://i.imgur.com/Sj46URC.png) ### 6. 最後一個元素的下一個位置 常數 v.cend() vector<int> ::const_interator cit = v.cend()-1; cout << *cit; ==3== ### 7. 最後一個元素位置 常數 逆向 v.crbegin() vector<int> ::const_reverse_interator crit = v.crbegin(); cout << *crit; ==3== ### 8. 第一個元素的左邊位置 常數 逆向 v.crend() vector<int> ::const_reverse_interator crit = v.crend()-1; cout << *crit; ==1== ## 2. 賦值 ### 1. 在尾巴新增元素 v.push_back(1); v.push_back(1); // {1 } v.push_back(2); // {1, 2 } v.push_back(3); // {1, 2, 3 } ### 2. vector<int> v = {1, 2, 3}; ### 3. vector<int> v( {1, 2, 3} ); ### 3. 複製 v1所有元素 vector<int> v2=v1; vector<int> v1 = {1, 2, 3}; vector<int> v2 = v1; 或 vector<int> v1 ( {1, 2, 3} ); vector<int> v2 ( v1 ); ### 4. 複製 陣列部分元素 vector<int> v(a, a+3); int a[3] = {1, 2, 3, 4, 5}; vector<int> v(a, a+3); // {1, 2, 3} 或 int n[5] = {1, 2, 3, 4, 5}; vector<int> v(n+2, n+4); // {3, 4} ==:100: v(起點, 終點的下一個位置)== ==下面erase會詳細講== ### 5. 複製 特定範圍元素 vector<int> v2(v1.begin()+2, v1.end()-1); vector<int> v1 = {1, 2, 3, 4, 5}; vector<int> v2(v1.begin()+2, v1.end()-1); // v2 = {3, 4} ## 3. 存取vector元素 ### 1. 存取 v[6] :::danger 第1個元素為v[0] 標籤為0 ≒ begin ≒ front 第2個元素為v[1] 標籤為1 最後一個元素 ≒ back 最後一個元素的下個位置 為 end ::: vector<int> v = {1, 2, 3}; cout << v[0] ; // 1 cout << v[1] ; // 2 v[0] = 4; cout << v[0] ; // 4 ### 2. 取第一個元素 v.front(); ==1== ### 3. 取最後一個元素 v.back(); ==3== ## 4. 新增移除元素 ### 1. 移除尾巴元素 v.pop_back(); vector<int> v = {1, 2, 3}; v.pop_back(); {1, 2, ==~~3~~==} v.pop_back(); {1, ==~~2~~==} ### 2. 新增尾巴元素 v.push_back(); ### 3. 插入元素 v.insert(); #### 1. 插放元素8 在第1個 vector<int> v = {1, 2, 3}; v.insert(v.begin(), 8 ); {==8==, 1, 2, 3} #### 2. 插放元素55 在第3個元素前面 v.insert(v.begin()+2, 55 ); {1, 2, ==55==, 3} #### 3. 插放元素66 在最後面 v.insert(v.end(), 66 ); = v.push_back(66) {1, 2, 3, ==66==} #### 4. 插放2個44元素 在最後面 v.insert(v.end(), 2, 44 ); {1, 2, 3, ==44, 44==} #### 5. 插放v2所有元素 在最後面 vector<int> v2 = {4, 5, 6}; v.insert(v.end(), v2.begin(), v2.end() ); {1, 2, 3, ==4, 5, 6==} #### 6. 插放v2前兩個元素 在最後面 v.insert(v.end(),v2.begin(),v2.begin()+2); {1, 2, 3, ==4, 5==} #### 7. 插放a[1]=2個 a[3]=100元素 在最後面 int a[] = {7, 2, 9, 100}; v.insert(v.end(),a[1],a[3]); {1, 2, 3, ==100, 100==} #### 8. 插放陣列a的前3個元素 在最後面 v.insert(v.end(),a,a+3); {1, 2, 3, ==7, 2, 9==} ### 4. 刪除元素 v.erase() #### 1. 刪除 第一個元素 vector<int> v = {1, 2, 3, 4, 5, 6, 7}; v.erase( v.begin() ); {==~~1~~==, 2, 3, 4, 5, 6, 7} #### 2. 刪除 最後一個元素 v.erase( v.end()-1 ); = v.pop_back; {1, 2, 3, 4, 5, 6, ==~~7~~==} #### 3. 刪除 標籤位置 元素 v.erase( v.begin()+1 ); {1, ==~~2~~==, 3, 4, 5, 6, 7} v.erase( v.end()-2 ); {1, 2, 3, 4, 5, ==~~6~~==, 7} #### 4. 刪除 範圍元素 v.erase( v.begin(), v.end() ); {==~~1, 2, 3, 4, 5, 6, 7~~==} 全部刪除 :::warning :100: v.erase( 起點, 終點的下一個位置 ) 例如 刪除前三個 起點=v.begin() 終點=v.begin()+2 終點的下一個位置=v.begin()+3 :+1:很重要:+1: ::: ##### 1. 刪除 前面3個元素 vector<int> v = {1, 2, 3, 4, 5, 6, 7}; v.erase( v.begin(), v.begin()+3 ); {==~~1, 2, 3~~==, 4, 5, 6, 7} ##### 2. 刪除 第2個 到第4個元素 v.erase( v.begin()+1, v.begin()+4 ); = v.erase( v.end()-6, v.end()-3 ); = (倒數第6個, 倒數第4個) {1, ==~~2, 3, 4~~==, 5, 6, 7} ##### 3. 刪除 倒數第6個 到 倒數第4個元素 v.erase( v.end()-6, v.end()-3 ); = v.erase( v.begin()+1, v.begin()+4 ); = (第2個, 第4個) {1, ==~~2, 3, 4~~==, 5, 6, 7} ##### 4. 刪除 後面3個元素 v.erase( v.end()-3, v.end() ); {1, 2, 3, 4, ==~~5, 6, 7~~==} ##### 5. 刪除 第2個 到 倒數第3個元素 v.erase( v.begin()+1, v.end()-2 ); {1, ==~~2, 3, 4, 5~~==, 6, 7} 應該用不到吧:question: ##### 6. 刪除 倒數第6個 到 第5個元素 v.erase( v.end()-6, v.begin()+5 ); {1, ==~~2, 3, 4, 5~~==, 6, 7} 應該用不到吧:question: ## 5. 清空 v.clear(); vector<int> v = {1, 2, 3}; v.clear(); {==~~1, 2, 3~~==} ## 6. 元素個數 v.size(); vector<int> v = {1, 2, 3}; v.size(); ==3== ## 7. 改變元素總數 v.resize() ### 1. 改變元素總數為3 後面多的刪除 vector<int> v = {1, 2, 3, 4, 5}; v.size(3); {1, 2, 3, ==~~4, 5~~==} ### 2. 改變元素總數為8 不足的補100 v.size(8, 100); {1, 2, 3, 4, 5, ==100, 100, 100==} ### 3. 改變元素總數為7 不足的補0 v.size(7); {1, 2, 3, 4, 5, ==0, 0==} ## 8. 空間大小 v.capacity(); 應該用不到吧:question: 當capacity不夠時 vector 就會重新申請空間, capacity會增加為原來的 2 倍或 1.5 倍, 例如:1、2、4、8、16、32 增長下去, 各個編譯器可能不同 vector<int> v; cout << v.size() << v.capacity(); // 0 0 v.push_back(1); cout << v.size() << v.capacity(); // 1 1 v.push_back(2); cout << v.size() << v.capacity(); // 2 2 v.push_back(3); cout << v.size() << v.capacity(); // 3 4 v.push_back(4); cout << v.size() << v.capacity(); // 4 4 v.push_back(5); cout << v.size() << v.capacity(); // 5 8 ## 9. 改變空間大小 v.reserve(); 應該用不到吧:question: