讀stl原始碼分析
前言再好的程式設計技巧,也無法讓乙個笨拙的演算法起死回生。
選擇了錯誤的演算法,便注定了失敗的命運。
何為演算法
以有限的步驟,解決邏輯或數學上的問題,algorithms!
演算法分析
空間複雜度、時間複雜度
分類 質變演算法:會改變操作物件的值,例如拷貝、互換。
非質變演算法:不改變操作物件的值,例如查詢、匹配。
演算法的泛化過程
舉例說明:
從乙個array中尋找特定的值:
我們的直覺反應是:
int *find(int *array,int size,int target)
return &(array[i]);
}
上面的做法暴露了容器太多的實現細節,因此太過依賴特定容器。
讓find()接收兩個指標作為引數:
int *find(int *begin,int *end,int
value)
為了不僅僅適用於array,我們使用模板:
templatet>
t *find(t *begin,t *end,const t& value)
上面的函式雖然能適用大部分容器,但是還還不能用於list,進一步演化:
在c++中,上述操作符或操作行為都可以被過載。如果我們以乙個原生指標指向某個list,則對該指標進行「++」操作並不能指向下乙個序列節點,但如果哦我們設計乙個class,擁有原生指標的行為,並使其」++「操作指向list的下乙個節點,那麼find()就可以施行於list容器上了。這便是迭代器(iterator)的觀念。迭代器是一種行為類似指標的物件,下面將find()函式內的指標以迭代器取代
template
iterator *find(iterator *begin,iterator *end,const t& value)
c 泛型的例項化
框架中應用了較多的泛型。下面來講講對泛型的例項化,以 為例,如 public class a public class b 以上的方法就是遇到最麻煩的問題。一直以來都以為default t 就可以例項化t這個對像,其實不然,這個只能起乙個null值的作用。如果要解決以上的問題現在有兩種方法 一 在使...
dubbo的泛化呼叫研究
結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...
dubbo的泛化呼叫研究
結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...