---
# System prepended metadata

title: C++ 語法細節

---

# C++ 語法細節

---

# 常用語法

----

```cpp!
signed main(){
    for (操作一;條件;操作二)
    // 條件符合繼續執行
    // 回圈開始前進行操作一
    // 每輪結束進行操作二
    // 操作內不能放分號
}
```

----

```cpp!
#define int long long
typedef long long ll;
const int N = 1e5+5;
signed main(){
    #define f(a,b) a*x+b
    int x = 10,y=20;
    cout << f(2,1) * f(1,2);
    // define 直接複製貼上 2*10+1*1*10+2不是21*12
    // define 當函式用要將輸入輸出加括號
    #define f(a,b) ((a)*x+(b))
    int a = x > y ? 10 : 20 + 3;
    if (x>y) a = 10;
    else a=23;
}
```

----

初始化陣列

```cpp!
#define INF 0x3f3f3f3f
int ar[100];
signed main(){
    fill(ar,ar+n,INF);
    memset(ar,INF,sizeof(ar));
    memset(ar,INF, n << 2); 
    //一個char為單位初始化，不能初始是1
    vector<int> br(n,vl);
    br.resize(n*2,3); //超出部分補3
    br.assign(n*2,4); //全部變4
    iota(ar,ar+50,0); // ar[i]=i,升序初始化
}
```

---

# 指標與參考

----

```cpp!

int *a,**b,*ar;
int _ar[201]
signed main(){
    ar = _ar + 100;
    a = new int[10];
    b = new int*[10];
    for (int i=0;i<10;i++)b[i] = new int [10];
}
```

----



```cpp!
void f(vector<int> &ar,const string &s){}
//避免陣列複製一份

signed main(){
    int x=10;
    int &y=x;
    y = 20; //x 也會變成20，避免動到可以用const
    int *a;
    int *&b=a;
    b = new int[10];// a被開了10格
}
```

---

# struct & operator

----

```cpp!
struct P{
    int u=10,v=20;
    int a,b;
    P *ch
    P():a(10),b(20){}
    P(int _a,int _b):a(_a),b(_b){}
    P(int k){
        if (k==0){
            a=b=0;
        }
        else {
            ch = new P(k-1);
            a=ch->a+ch->b;
            b=ch->a-ch->b;
        }
    }
    bool operator<(const P &rh)const {return u<rh.u}
    int operator()(int x){return a*x+b;}
    P operator+(const P &rh)const {return P(a+rh.a,b+rh.b);}
    void operator+=(const P &rh){a+=rh.a,b+=rh.b;}
}ar[100];
P b[100];
```

----

```cpp!
#define F first
#define S second
typedef pair<int,int> pii;
pii operator+(const pii &a,const pii &b){
    return make_pair(a.F+b.F,a.S+b.S);
}
int operator*(const pii &a,const pii &b){
    return a.F*b.F+a.S*b.S;
}
pii operator*(const pii &a,const int r){
    return make_pair(a.F*r,a.S*r);
}
ostream& operator<<(ostream &os,const pii &a){
    return os<<'('<<a.F<<','<<a.S<<')';
}
signed main(){
    pii tp={3,5};
    cout<<(tp*5);
}
```

---

# 匿名函式

----

```cpp!
#define iter(a) (a).begin(),(a).end()
#define pb emplace_back
int w[100];
bool cmp(int a,int b){return w[a]<w[b];}

signed main(){
    vector<int> od(n);
    iota(iter(od),0);
    sort(iter(od),cmp);
    sort(iter(od),[&](const int &a,const int &b){
        return w[a]>w[b]; }) //1代表a前b後是正確排序
}
```

----

函式裡定義函式
```cpp!
int sz[100],f[100];
vector<int> eg[100];
signed main()
{
    int x = 10,n; //好處：可以用區域變數
    function<int(int, int)> f = [&](int a, int b)
    {
        return a * x + b;
    };
    auto ff = [&](int a, int b) -> int
    {
        return a * x + b;
    };
    auto dfs = [&](int u,int fa)->void
    {
        sz[u]=1;
        for (const int v:eg[u])
            if (v!=fa)
                sz[u]+=sz[v];
        f[u]=n-sz[u];
    };
    cout << ff(3, 2);
}
```