---
# System prepended metadata

title: 使用說明

---

# 書寫風格
## Header, namespace

:::warning
為了方便閱讀，每個程式碼開頭：

```cpp=
#include <bits/stdc++.h>
using namespace std;
```

請讀者自行斟酌使用。
:::

- `#include <bits/stdc++.h>` 包含了絕大多數競技程式會用到的 header ，簡稱**萬用標頭檔**
    - 這樣你不用手打好多個 header
- `using namespace std;` 則表示省略書寫**所有** `std::` 
    - 如果覺得只有特定幾個需要省略：`using std::XXXX` 


## Bracket

為了方便閱讀，在只有一個敘述的循環，不使用大括號。如下

```cpp=
for (int i = L - 1; i > 0; i--)
    for (int j = 0; j < i; j++)
        if (train[j] > train[j + 1])
        {
            swap(train[j], train[j + 1]);
            cnt++;                   
        }
```

意思等同於：

```cpp=
for (int i = L - 1; i > 0; i--)
{
    for (int j = 0; j < i; j++)
    {   
        if (train[j] > train[j + 1])
        {
            swap(train[j], train[j + 1]);
            cnt++;                   
        }
    }
}    
```

## 解除同步流、 I/O 綁定
:::warning
以下操作會有效加快在刷題網站的輸入輸出效率，但是不建議與 `printf, scanf` 等混用

```cpp=
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
```
更多內容：[c++ - Significance of ios_base::sync_with_stdio(false); cin.tie(NULL); - Stack Overflow](https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull)
:::

## 其他

- `'\n'` 取代 `std::endl`
- 變數命名傾向 snake_case
    - `bool` 變數命名： `is_XXXX`


# 常用 STL 標準函式庫

- **二級標題**表示 header
- **一級清單**表示 `std::`
- **二級清單**表示 成員函數，==成員函數有些會重複包含在其他 header==

以下看到的英文，如果都能背起來、知道如何用、且妥善使用，對解題目會有大幅幫助。


:::info
從 C 繼承的 header，會改名如下

```cpp
// C 的函式庫
#include <stdio.h>
#include <string.h>

// 轉換成 C++ 版本
#include <cstdio>
#include <cstring>
```

而在 C++ 版本中，這些 header 也屬於 `std::` 命名空間，比如說

```cpp
printf()      // 在 <stdio.h>, <cstdio> 下可以使用
std::printf() // 只有在 <cstdio> 下可以使用
```

然而，混用 printf, scanf, cin, cout 是挺危險的。筆者選擇用 iostream
:::

:::success
C++ 標準函式庫中，某些 header 會隱含包含其他 header，這要看實際 compiler 怎麼定義。

比如說：
- `iostream` 可能包含 `string` `cstdlib`
- `map` 可能包含 `utility`
- `algorithm` 可能包含 `iterator`, `functional`

詳細請看：[cppreference.com](https://en.cppreference.com/index.html)
:::

## iostream

- cin
    - ignore()
- cout
- endl

## iomanip

- setprecision()
- fixed
- setw()
- setfill()
- right, left, internal()


## string

- std::to_string()
- string
    - empty
    - size(), length()
    - substr()
    - find()
    - compare()
    - to
- getline()

## sstream

- stringstream
  - str()
  - clear()
  - operator<<, operator>>
- istringstream
- ostringstream

## vector

- vector
  - size()
  - empty()
  - begin(), end()
  - push_back(), pop_back()
  - front(), back()
  - operator[]
  - clear()

## algorithm

- sort()
- reverse()
- find()
- max(), min()
- swap()
- next_permutation()
- binary_search()
- lower_bound(), upper_bound()

## map

- map
  - insert()
  - find()
  - count()
  - operator[]
  - erase()

## unordered_map

- unordered_map
  - insert()
  - find()
  - count()
  - operator[]
  - erase()

## set

- set
  - insert()
  - find()
  - count()
  - erase()

## queue

- queue
  - push(), pop()
  - front(), back()
  - empty()

## stack

- stack
  - push(), pop()
  - top()
  - empty()

## utility 

- pair
  - first, second
  - make_pair()

## tuple

- tuple
  - get()
  - make_tuple()
- tie()


## bitset

- bitset
  - set(), reset()
  - flip()
  - test()
  - count()
  - any(), none(), all()
  - to_string(), to_ulong()
  - operator[]

## cmath

繼承 C 語言

- abs()
- sqrt()
- pow()
- floor(), ceil()
- sin(), cos(), tan()

## cctype
    
繼承 C 語言
- isalpha(), isdigit()
- tolower(), toupper()

## climits

## cstring
    
繼承 C 語言
- strlen()
- strcmp()
- strcpy()

## numeric
- accumulate()
- gcd(), lcm() // C++17
- iota()
    
# C++ 語法
    
## auto

[C++ auto& vs auto - Stack Overflow](https://stackoverflow.com/questions/29859796/c-auto-vs-auto)

![image](https://hackmd.io/_uploads/rJ_QE-ZrZe.png)
