###### tags: `C++` `10.basic data structures`
:::success
暫定目標APCS觀念5級 實作3級
等考過 再4級 5級 6級
:::
# 1. vector
## 1. 初始化 vector <int> v;
## 1.5 疊代器 iterator 像是游標 指向位置

### 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> >()'|
:::

### 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: