演算法的泛化過程

2021-07-11 12:23:27 字數 1125 閱讀 4917

讀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打壓,也...