Skip to content

C/C++技巧與觀念

  • 關於2D array 2Darray 中,系統預設是指向一維陣列的陣列指標,因此傳遞時必須給其大小(只能空一維)
    maze[2][4],表示 maze[0][0] 與 maze[1][0] 相對位移量為 4
    2Darray是一塊連續的記憶體空間,故
    Maze[0][0]+5並不會爆掉(Maze[1][1])
    一個動態配置的例子
int **ia = (int **)malloc(sizey * sizeof(void *)); for(y = 0; y != sizey; ++y) 
	ia[y] = (int *)malloc(sizex * sizeof(int));
  • 應優先檢查邊界 If(A[i]符合條件 && i沒超過邊界 ) (X,A[i]可能爆掉) If(i沒超過邊界 && A[i]符合條件) (O, 超過邊界會early stop)

  • 小提醒

  1. while()要記得i之類的變數有沒有++
  2. 裡面計數變數初始化要放loop外面
  • local pointer Local pointer在函式中宣告,可以回傳,離開函式會被收回,接到的會變垃圾
    應傳入pointer的位置,在函式內直接去修改
    例子:
char *fun(char*s){
  char ans[100];
  ...
//return ans;  is wrong
	strcpy(s,ans);
	return s;
}
  • 關於getchar() 與 buffer Getchar()甚麼都吃,包括空白 換行,使用時要注意
    相當於一定從buffer中取出第一個
    因此假設
    1 2 buffer中會有1 2\n3 4
    3 4 而前面scanf(“%d”….)也只會取走 數字部分,\n還是在buffer中

不要以為scanf會捨棄之前還在buffer內的data(往後指)
Eg 剛剛就算把數字都scan完,buffer還是存有兩個\n

解法fflush(stdin) 去清空buffer
fflush(stdin) in stdio.h

  • Overflow
    檢查Overflow可以先用INT_MAX(or INT_MIN)
    反運算看有沒有超過當前值
    例如 x+5>INTMAX (X)
    x>INTMAX-5 (o)

  • Merge sort 用linked list 實作
    1.可以用一個跑兩倍快的指標,與一個基本指標來決定middle
    2.不要隨意動指標架構(insert)
    ,可以改動節點資料就好

  • 甚麼時候要傳指標(位址) 當有改動到”資料本身”的時後 傳 ListNode * ptr 可以改指向ptr的結構的資料 但是ptr指向是無法更改的

(ptr=A 不改指標內的東西) (ptr->next=A ptr指向的東西被改變了!) 關鍵在有沒有反參考(取裡面的東西)

例子: 為甚麼我會需要新的變數p?

ANS:因為pop是把整個空間收回來
甚至沒有改動任何東西

  • 小提醒:
    記住任何”檢查條件”都有可能造成 Seg fault (應謹慎檢查指標)
    指標初始化請務必 賦NULL

  • 運算中序->前序演算法
    如果要使用堆疊法將運算式中序式轉為前序式,則使用迴圈由後往前取出中序式的字元,遇運算元直接輸出;
    Rule 1
    堆疊運算子與右括號; 堆疊中運算子優先順序若大於讀入的運算子優先順序的話,直接輸出堆疊中的運算子,再將讀入的運算子置入堆疊;
    Rule 2
    遇左括號輸出堆疊中的運算子至右括號。前面整個演算過程中被輸出的字元再反序列出,就是前序表示式。

Rule 3
無input就清空stack 至output

why?

  1. 前序式代表最後算的在最前面,所以遇到優先順序比自己小(後面的)的(或一樣的) 自己當然就先輸出
  2. 括號裡面東西最優先,尤其是越中間的括號優先度越大,所以碰到就把括號內包住的都輸出( 可視括號比*/優先度還大,所以碰到*/為input不輸出括號,直到又有一個新括號) ( 括號內也要遵守1)

*Ambiguous problem
如果自己定義變數無重複,那可能是與系統include檔重複了
總之=>改名

指標變數與指標內容
Cur=
head的話
Cur=NULL 只是改動輔助指標,對list沒有實質影響
Cur->next=NULL 取用輔助指標指向的資料,並賦值,才算改動list!

應用: 刪除一個linked list的中間節點

Node=Node->next (X,只有指標改了)
Node=Node->next (O,改動指標指向的Node)

*STL小技巧 \vector<bool>temp(NUM,0); \vector<\vector<bool> > map(NUM,temp); 可做多維vector插入

要修改vector裡面的值要用reference