一、泛型程式設計的一些基本 :
1、泛型程式設計:
1.1、程式盡可能的通用。
1.2、將演算法從資料結構中抽象出來,成為通用。
1.3、模板並不是單純的函式,不能憑空的生成,是用來產生**的**,可以減少**量。
1.4、template<> 中不要使用class, 使用typename;
1.5、模板程式設計與巨集的區別:
巨集是在編譯時替換,而模板是在編譯時生成。
1.6、通過函式模板寫的模板函式,在例項化的時候生成了很多的**。
template//函式模板1.7、模板在例項化時有兩個步驟:const t& max() //模板函式:在編譯時例項化(非運時)
{}
1、檢查語法錯誤;
2、檢查呼叫錯誤; 通過了語法檢測之後, 生成對應的函式來進行呼叫檢查。
1.8、模板的宣告和定義不能放在不同的檔案,包含也不行。 在宣告的時候模板函式的名字已經改變了,
所以找不到定義。
1.9、模板引數列表, 必須在函式引數列表中使用至少一次。類模板是無法推導的。 所以在類中是可以不用 t 型別。
1.10、模板函式是可以構成過載的,
1.10.1、條件:
1、函式模板引數不同。
2、模板函式引數列表不同。
1.10.2、模板函式還可以和普通函式構成過載。
1.10.3、在函式模板中的過載是不能提公升轉換的。
1.11、
template: num 必須傳遞乙個確定的值。 因為是編譯時(非執行時)確定的。1.12、特化:
1.12.1、函式模板的特化:
1、
template<> // 特殊化,當函式模板的 t = const char*; 的時候就不用生成了。如果通篇沒有使用到這個特化是不會生成的。const char* max(const char* lhs, const char* rhs)
2、呼叫規則:首先呼叫非模板函式(提公升轉化) -> 特化 -> 模板函式所生成的函式。
1.12.2、類的特化:
1、類的特化(就是直接給定型別):
template<>和函式的特化是一樣的;class array{}
template特化:template<>2、類的特化並不是繼承, 兩者沒有任何關係, 是兩個類。void foo() void foo()
{} {}
1.12.3、模板類在編譯的時候會生成,
如果對某個模板類進行了特化,那他就不會生成。所有的**都是自己寫的,
就相當於乙個全新的類。
1.12.4、偏特化:
template<> // 就是對部分成員的特化。不是模板函式全特化。1.12.5、最大可能會對指標型別進行特化,因為不進行特化的話只會進行淺拷貝,這可能不符合需求。array::array() // 特化的只是部分的方法,其餘的**編譯器還是會
{} // 幫你生成。而進行了偏特化的**就不會幫你生成了。
1.13、模板類中的成員函式還可以做為模板函式。 另外模板類之間可以進行繼承。
templateclassmytype};類外定義:
template//注意順序
templatevoid classmytype::assign(x other)
{}
泛型的一些理解
泛型是為了解決型別不確定的問題,業務邏輯相同只有物件型別不同。是屬於編譯期的,編譯器編譯完之後,帶有泛型的程式,生成的.class位元組碼檔案中將不存在泛型。以此使程式在執行時效率不受影響,這個過程被稱為泛型 擦除 泛型泛型又可以分為集合泛型和自定義泛型。一 集合泛型 list list1 new ...
泛型的一些問題
泛型的概念 把型別明確工作推遲到建立物件或者呼叫方法時才明確的一種機制 泛型的語法 引用型別,引用型別 使用泛型好處是避免了向下轉型,例如集合中的元素 如果不使用泛型,取出元素後,需要向下轉型成為本類才可以獲得 arraylist arraylist newarraylist arraylist.a...
關於泛型容器的一些使用
最近工作碰到的。如果你要儲存大量資料,而且還要給他排好序。那麼最好使用deque,因為vector太浪費記憶體,list會造成記憶體碎片,而且定位也慢,map雖然定位很快,也很方便,但是消耗的記憶體比較多,也比較容易出現記憶體碎片。deque是以記憶體塊分配,首先不會造成太大的記憶體浪費,在新增資料...