# C++ Common Usage for Leetcode
## [Map](https://shengyu7697.github.io/std-map)
- map的實做方式會用red-black-tree實做,可以保證在 O(log n)時間內完成搜尋插入刪除等等。
### 常用功能
### Example
- 初始化
1. 直接insert
```c++
std::map<int, std::string> studentMap;
studentMap.insert(std::pair<int, std::string>(1, "Tom"));
studentMap.insert(std::pair<int, std::string>(7, "Jack"));
studentMap.insert(std::pair<int, std::string>(15, "John"));
```
2. 使用陣列
```c++
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
studentMap[7] = "Jack";
studentMap[15] = "John";
```
3. or
```c++
std::map<int, std::string> studentMap = {
{1, "Tom"},
{2, "Jack"},
{3, "John"}
};
```
- 插入東東
1. 你可以直接給值 (直接覆蓋)
```c++
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
...
studentMap[1] = "John";
```
3. insert 函數(如果有的話會return flase)
```c++
#include <iostream>
#include <string>
#include <map>
int main() {
std::map<int, std::string> studentMap;
studentMap.insert(std::pair<int, std::string>(1, "Tom"));
std::pair<std::map<int, std::string>::iterator, bool> retPair;
retPair = studentMap.insert(std::pair<int, std::string>(1, "Tom"));
if (retPair.second == true)
std::cout << "Insert Successfully\n";
else
std::cout << "Insert Failure\n";
return 0;
}
```
### Example
```c++
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
//declaration container and iterator
map<string, string> mapStudent;
map<string, string>::iterator iter;
map<string, string>::reverse_iterator iter_r;
//insert element
mapStudent.insert(pair<string, string>("r000", "student_zero"));
mapStudent["r123"] = "student_first";
mapStudent["r456"] = "student_second";
//traversal
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
cout<<iter->first<<" "<<iter->second<<endl;
for(iter_r = mapStudent.rbegin(); iter_r != mapStudent.rend(); iter_r++)
cout<<iter_r->first<<" "<<iter_r->second<<endl;
//find and erase the element
iter = mapStudent.find("r123");
mapStudent.erase(iter);
iter = mapStudent.find("r123");
if(iter != mapStudent.end())
cout<<"Find, the value is "<<iter->second<<endl;
else
cout<<"Do not Find"<<endl;
return 0;
}
```
## [Vector](https://shengyu7697.github.io/std-vector/)
- 底層為一個連續的記憶體空間,容量不夠會重新申請空間
### 常用功能
- push_back: 把元素加到尾巴,必要的時候進行記憶體配置
- pop_back : 移除尾巴元素
- insert : 插入元素
- erase: 移除某個位置或是一段位置的元素
- clear : 清除所有
- empty : 回傳是否為空
- [i] : 拿東西
- at(i) : 拿東西,越界了拋出例外
- reverse() : 預先配備大小
### Example
- 初始化
```c++
#include <vector>
using namspace std;
int main(){
vector<int> v1;
v1.push_back_back(1); #把1推進去
v1 = {1,2,3,4,5};
vector<int> v2;
v2(v1.begin()+2, v1.end()-1); //3,4
#移除尾巴
v2.pop_back();
# 遍歷整個 vector
#1. 使用loop
for(int i=0; i< vec1.size(); i++){
cout << vec1[i] << " ";
}
#2. 使用
for(auto it=vec.begin(); it != vec.end(); ++it){
cout << *it << " ";
}
return 0;
}
```
- 尋訪
```c++
for(int i=0;i<v.size();i++){
cout << v[i] << " ";
or
cout << v.at(i) << " ";
}
vector<int>::iterator it_i;
for(it_i=ff.begin();it_i!-ff.end();+_+it_i){
cout << (*it_i) <<endl;
}
```
- Construction and Assignment
```c++
int array[] = {0,1,2,3,4}
vector v(10,0); // {0,0,0,0,0,0,0,0,0}
vector v1;
vector v3(v.begin(), v.end());
v1.assign(v.begin(), v.end()); v1 複製到 v
v1.assign(v.begin(), v.begin()+5); 複製v前五個元素到v1
v1.assign(array, array+5); 複製 array前五個元素到v1
```
- define 2D array
```c++
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector <vector<int> > array(3); // 先有三個空間
for (int i = 0; i<3; i++){
array[i].resize(3); // 給每個元素再開三個空間
for(int j =0; j<3; j++){
cin >> array[i][j]; // 直接對開闢的空間給值
}
}
}
```
- 使用者定義的資料型態
```c++
class NODE{
public:
char symbol;
int count;
};
int main(){
NODE temp;
vector<NODE> gem_list;
tmp.symbol = 'a';
tmp.count = 0;
gem_list.push_back(temp);
}
```