# C++ STL array 簡單整理用法
###### tags: `STL`
初學STL array 整理一些用法
使用前先使用`#include <array>`
宣告一個五個元素大小的陣列myArray
```
std::array<int, 5> myArray;
```
宣告時一定得給予大小
支援兩種初始化
```
std::array<int, 5> myArray = {1, 2, 3, 4, 5} // intialized list;
std::array<int, 5> myArray {1, 2, 3, 4, 5}; // intialized uniform list;
```
STL Container 支援 array 複製 或 intialized list 賦值
```
std::array<int, 5> myArray2 = myArray;
std::array<int, 5> myArray3;
myArray3 = myArray;
myArray = {8, 7, 6, 5, 4};
```
對陣列元素存取有兩種方式
第一種用下標(subscribe) [] 存取 `myArray[1] = 5;`
第二種用at()存取 `myArray.at(1) = 5;`
值得一提的是at() 會做邊界檢查,如果超出邊界會丟出例外,否則回傳元素參考
## 比較 [] 與 at()
1. [] 存取速度較快,at()較慢但較安全
2. []沒有邊界檢查,at()有
比較Cstyle array跟STL array
Cstyle array 有可能被隱轉成pointer,傳遞到函數時無法得知大小
而STL array保有原始大小
得知其大小方法`myArray.size()`
## 宣告二維陣列
`std::array<std::array<int, 3>, 5> arr2;`
等同於Cstyle array宣告如下
`int arr[3][5];`
## 迴圈用法
1. for-each (ranged for) loops
```
for(auto &element : myArray) {
std::cout << element;
}
```
2. iterator
```
/*未來補上*/
```
3. size_type
```
for(std::myArray<int , 5>::size_type i {0}; i < myArray.size(); ++i) {
std::cout << myArray.at(i);
}
```
or using ` using index_t = std::array<int, 5>::size_type;`
```
using index_t = std::array<int, 5>::size_type;
for(index_t i {0}; i < myArray.size(); ++i) {
std::cout << myArray.at(i);
}
```
原因是因為索引跟size()回傳的都是unsigned type
也可以使用 size_t,最佳解是不要手動操作索引且使用for_each
## std::sort()
from large to small:
```
std::sort(myArray.begin(), myArray.end(), [](int x, int y){ return x > y;});
```