演算法預備學習 C ,java演算法與資料結構

2021-08-08 10:44:15 字數 2516 閱讀 8129

泛型程式設計

重寫與過載

裝箱與拆箱

ref 關鍵字

c++的函式指標在c#的替代

debug.assert

icomparable介面的實現

選擇排序

1.定義,我自己的認識,泛型,也是特殊地型別,不確定指定唯一型別。泛型是為了**更加靈活,減少**量。使用了泛型,不同型別都可以使用。

//c++**

templatet>

void forcopy(t arr){};

//c#**

void forcopy(t arr){};

//特別地,我覺宣告時有時候不用加 例如copy//但是這種情況就必須了

delegate void algorithms(t arr);

void testalgorithms(alforithms func, t arr);

上面是我在學習演算法過程中使用的**,接下來將擴充套件泛型其他的用法。

1。泛型的名字不止可以定義為t,其他也是可以的,尤其是可以描述性的。神奇

public inte***ce isessionchannel

public delegate toutput converter(tinput from);

public class list

2。型別引數的約束 where t: class ,還可以where f : 基類

對多個進行約束

void findwide(int i) where u :struct

where f :struct

3。為泛型集合類或表示集合中的項的泛型類定義介面通常很有用處。 為避免對值型別的裝箱和取消裝箱操作,泛型類的首選項使用泛型介面,例如 icomparable而不是 icomparable。 .net framework 類庫定義多個泛型介面,以將其用於 system.collections.generic 命名空間中的集合類。

上面官方說的,謹記~~~~

4。c# 泛型的靈活性與 c++ 模板不同。 例如,雖然可以呼叫 c# 泛型類中的使用者定義的運算子,但是無法呼叫算術運算子。

我只說一點,重寫是將原有的方法進行改造,而過載是在原有的方法加上對其他型別的操作,二者雖然與需要重「」名的方法一樣,但是重寫是名和引數型別還有返回型別一樣,過載另外乙個是引數不一樣。

object obj = 1;//值型別轉換到引用型別,

int i = (int)obj//引用型別轉換到值型別

之前查到乙個網頁,講了在編譯器實際發生的過程:分析裝箱與拆箱

過程 : 值型別是要放在棧上的,而object是引用型別,它需要放在堆上。這時候需要將棧裡的元素取出,然後存到堆中。可以預知這個是耗費cpu的運算時間的。

哈哈,然後還看到使用泛型可以減少裝箱拆箱的功能,並且提高了效能

我可以這樣理解,就是你對含有ref的關鍵字進行操作時,會改變原有的值,~讓我們來看看。

例如

void swap(ref t a,ref t b )

...swap(ref a[0],ref a[1]);//就真的會交換值,哈哈這個估計是c#從c++的指標參考來的,而且還方便一些

...

使用委託來解決,最簡單的委託可以看做是方法的別名(因為方法可以隱式轉換給委託),但是也可是很多方法的別名

下面是具體的解決方案,為了傳入不同的排序演算法

delegeta void sortalgorithms(t arr,int n) : icomparable;

void testsort(string name, sortalgorithms func,t arr,int n) : tcomparable

{};

我之前一直很困惑,assert在**使用,但是現在發現了。比如上面排序演算法,排序的大小肯定要正確才行,如果不正確我就不需要計算他所花費的時間。

void testsort(string name, sortalgorithmsfunc,t arr,int n) : tcomparable;
使用乙個斷定,**簡潔~

還可以使用在上限必須必下限大的情況。

public

class comparablenum : system.icomparable

set

} public

intcompareto(comparablenum other)

}

這是個很慢的演算法,但是有時候難的演算法就是由簡單的演算法啟發得到,並且有些時候,使用簡單的演算法是更好地選擇

void selectionsort(t arr , int n)

}

哈哈,這次呦呦呦寫完了。並且我感覺我的**現在好好看,這篇東西都是我在實現將演算法課的c++**轉換到c#遇到的問題,以及解決的方案,看來還是不錯的~~~。現在可以去休息拉。

演算法預備知識

1 演算法設計要求 正確性 可讀性 健壯性 當輸入資料不合法時,演算法也能做出相關處理,而不是產生異常或莫名其妙的結果 時間效率高和儲存量低 2 演算法效率的度量方法 推導大o階方法 用常數1取代執行時間中的所有加法常數 在修改後的執行次數函式中,只保留最高端項 如果最高端項存在且不是1,則去除與這...

C 演算法學習 預備知識(4) 異常處理(1)

異常提供了一種通過將控制轉移到名為處理程式的特殊功能來對我們程式中異常情況 如執行時錯誤 做出反應的方法。要捕獲異常,我們必須將一部分 放在異常檢查下。這是通過將該部分 包含在try塊中來完成的。當該塊中出現異常情況時,丟擲異常,將異常處理程式傳遞給控制項。如果沒有丟擲異常,將繼續正常執行,所有處理...

資料結構和演算法學習 1 預備知識

學好資料結構和演算法,是我的追求,這並不容易。基礎不牢,c語言學不好,資料結構你就推不動,陣列,指標之類的東西都不會,怎麼學?今天從頭開始,一點兒一點兒弄懂。文章裡面的 都是天勤資料結構裡面的,我按照這本書複習,加上自己的理解,寫清楚思路。1.結構體。結構體相當於乙個集合,裡面一般存放一些型別不同的...