型別萃取 在模板這裡主要就是對於模板的不同型別的例項化 有不同的方案 這樣可以提高效率等
比如 下面的 順序表 在擴容時的拷貝
對於沒有含有指向空間的指標的類 如int 自動使用memcpy()
對於含有指向空間的指標的類 如string 就自動乙個乙個的賦值 防止淺拷貝導致兩個指標指向同一空間 析構兩次時出錯
型別萃取實現 主要用到了
模板模板特化 內嵌型別 也可用函式過載 詳見copy()
//(1)-------型別萃取 實現順序表
#ifndef __copy_h__
#include
#include
using namespace std;
struct truetype //內建型別
struct falsetype //非內建型別
template//_tp 型別 預設(沒特化)使用 迴圈 乙個乙個賦值
struct typetraits
/內嵌型別
// 特化:實現同乙個型別ispodtype對於不同的特化表示的型別不同 如 falsetype/truetype
// 使用 memcpy 的型別 用struct typetraits<...>;
template<>
struct typetraits
template<>
struct typetraits
template<>
struct typetraits
template<>
struct typetraits
//還有未特化的 這裡只是舉幾個例子 實際中應盡可能寫完整......
// 使用 迴圈 乙個乙個賦值的型別 使用struct typetraits<...>;
template<>
struct typetraits
typedef falsetype ispodtype;
//**********==== 函式過載 的 應用 【copy第一種方式的實現原理】**********====
int m_copy(int a, int b, int)
int m_copy(int a, int b, float)
#if 0 //*************************=
//**********== 1 萃取 copy的第1種方法 **********====
// 利用 函式過載來區分 falsetype truetype
template
void copy(t* dst, const t* src, int size, falsetype)
template
void copy(t* dst, const t* src, int size, truetype)
void test2()
#endif //*************************=
//**********== 1 萃取 copy的第2種方法 **********====
// 用模板函式
template
void copy(t* dst, const t* src, size_t size)
ispodtype()
#endif
//--------------- seq_list_by_cuiqu.cpp--------
#define _crt_secure_no_warnings 1
#include "copy.h"
template
class seqlist
public:
private:
// 更高效 使用【型別萃取】 對於可以使用memcpy的型別使用memcpy
// 對於不可以使用memcpy的 使用 迴圈乙個乙個賦值 增強效率
// 因為memcpy效率比較高
copy(tmp, _data, _size);
private:
//***************==注意2 預設拷貝函式出現淺拷貝問題 **********=
//這要寫 拷貝構造 防止出現淺拷貝問題
// 例如對於string這種含有指向動態開闢空間 的 指標成員
template
seqlist::seqlist(const seqlist& s)
template
seqlist::seqlist()
template
seqlist::~seqlist()
template
void seqlist::pushback(const t& d)
template
void seqlist::popback()
template
void seqlist::pushfront(const t& d)
template
void seqlist::popfront()
template
seqlist& seqlist::operator=(const seqlist& s)//注意用seqlist&
template
int seqlist::find(const t& d)
template
void seqlist::reverse()
template
void seqlist::insert(int pos, const t& d)
template
void seqlist::sort()
int main()
seqlist s3;
s3.print();
//(2) 容器介面卡
容器介面卡 允許 模板引數 是模板類的類型別
// container 介面卡練習
//template
//模板的模板引數
template class container = seqlist>
class stack
public:
private:
containercon;
int main()
#endif
//#include
//int main()
//#include
//int main()
//小知識點
//*****===隱式轉換
class d
public:
explicit d(int d)
:_d(d)
{cout<<"d()"int _d;
int main()
d d = 1; //防止使用d(int d)建構函式 隱式轉換 可以使用關鍵字explicit 阻止隱式轉換
getchar();
本文出自 「城市獵人」 部落格,請務必保留此出處
C 容器介面卡
1 什麼是介面卡 2 容器介面卡 3 為什麼將stack queue和priority queue稱作為容器介面卡 雖然stack queue priority queue中也可以存放元素,但在stl中並沒有將其劃分在容器的行列,而是將其稱為容器介面卡,這是因為每個容器在底層都有自己的實現方式,而s...
C 容器介面卡
除了順序容器外,標準庫還定義了三個順序容器介面卡 stack,queue和priority queue。介面卡是一種機制,能夠使某種事物行為看起來像另外一種事物。乙個容器介面卡接受一種已有的容器型別,使其行為看起來像一種不同的型別。所有容器介面卡都支援的操作和型別 操作和型別 說明size type...
C 容器介面卡
除去順序容器vector 向量,可變大小陣列 deque 雙端佇列 list 雙向鍊錶 forward list 單向鍊錶 array 固定陣列大小,array的大小不可變 外,標準庫還定義了三個順序容器介面卡 stack queue priority queue 介面卡是標準庫中乙個通用的概念,包...