stl 泛型的一些基本

2022-09-13 18:12:10 字數 1798 閱讀 2896

一、泛型程式設計的一些基本 :

1、泛型程式設計:

1.1、程式盡可能的通用。

1.2、將演算法從資料結構中抽象出來,成為通用。

1.3、模板並不是單純的函式,不能憑空的生成,是用來產生**的**,可以減少**量。

1.4、template<> 中不要使用class, 使用typename;

1.5、模板程式設計與巨集的區別:

巨集是在編譯時替換,而模板是在編譯時生成。

1.6、通過函式模板寫的模板函式,在例項化的時候生成了很多的**。

template//函式模板

const t& max()  //模板函式:在編譯時例項化(非運時)

{}

1.7、模板在例項化時有兩個步驟:

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<>

void foo()        void foo()

{}             {}

2、類的特化並不是繼承, 兩者沒有任何關係, 是兩個類。

1.12.3、模板類在編譯的時候會生成,

如果對某個模板類進行了特化,那他就不會生成。所有的**都是自己寫的,

就相當於乙個全新的類。

1.12.4、偏特化:

template<>        // 就是對部分成員的特化。不是模板函式全特化。

array::array() // 特化的只是部分的方法,其餘的**編譯器還是會

{}            // 幫你生成。而進行了偏特化的**就不會幫你生成了。

1.12.5、最大可能會對指標型別進行特化,因為不進行特化的話只會進行淺拷貝,這可能不符合需求。

1.13、模板類中的成員函式還可以做為模板函式。 另外模板類之間可以進行繼承。

templateclassmytype

};類外定義:

template//注意順序

templatevoid classmytype::assign(x other)

{}

泛型的一些理解

泛型是為了解決型別不確定的問題,業務邏輯相同只有物件型別不同。是屬於編譯期的,編譯器編譯完之後,帶有泛型的程式,生成的.class位元組碼檔案中將不存在泛型。以此使程式在執行時效率不受影響,這個過程被稱為泛型 擦除 泛型泛型又可以分為集合泛型和自定義泛型。一 集合泛型 list list1 new ...

泛型的一些問題

泛型的概念 把型別明確工作推遲到建立物件或者呼叫方法時才明確的一種機制 泛型的語法 引用型別,引用型別 使用泛型好處是避免了向下轉型,例如集合中的元素 如果不使用泛型,取出元素後,需要向下轉型成為本類才可以獲得 arraylist arraylist newarraylist arraylist.a...

關於泛型容器的一些使用

最近工作碰到的。如果你要儲存大量資料,而且還要給他排好序。那麼最好使用deque,因為vector太浪費記憶體,list會造成記憶體碎片,而且定位也慢,map雖然定位很快,也很方便,但是消耗的記憶體比較多,也比較容易出現記憶體碎片。deque是以記憶體塊分配,首先不會造成太大的記憶體浪費,在新增資料...