拷貝函式之型別萃取

2021-08-09 17:33:48 字數 2529 閱讀 3793

經常在寫模板順序表的時候遇到乙個問題,在拷貝元素的時候應該用for迴圈進行賦值,還是應用效率較高的memcpy.今天我們就來討論一下。

首先看下它們各自的優缺點

(1) for 迴圈拷貝比較安全,容易想到並且實現;但是在順序表元素太多時,時間複雜度高的情況下,for迴圈拷貝的效率比較低。

(2)memcpy是記憶體拷貝函式,任意內建型別的資料都可以拷貝,並且效率很高;但是memcpy的拷貝屬於淺拷貝,在涉及字串等自定義型別的資料時,拷貝會出現異常,程式會崩潰。

插入兩個小概念:

1. pod:plain old data平凡型別(無關痛癢的型別)–基本型別

指在c++中與 c相容的型別,可以按照 c的方式處理。

2. typeid可以獲取到乙個型別的名稱,但是不能拿來做變數的宣告。

下面介紹三種確定用for迴圈拷貝或者memcpy的方式。

第一種:封裝乙個判別是否是內建型別的函式ispodtype();

bool ispodtype(const char* type)

; int sz = sizeof(arr) / sizeof(arr[0]);

for (int i = 0; i < sz; i++)

return false;

} static char*arr = 是將屬於內建型別的四個資料型別進行羅列,將要拷貝的型別進行比對。

這種方式的呼叫函式為

template

void copy(t*dest, t*src, int sz)

else }

} 這種方式容易理解並且想到。

第二種:將型別名稱當作特殊的資料型別,將內建型別進行特化,這樣,在建立例項時,模板類函式會對型別進行推演,從而找到對應的模板函式。

下面來看**

struct truename };

struct falsename

}; template

struct name

;template < >

struct name

;template < >

struct name

;template < >

struct name

;template < >

struct name

;函式呼叫

template

void copy(t*dest, t*src, int sz)

else }

}

這種方式對模板函式進行特化,也是不錯的方式。

第三種:這種方式也是建立在模板函式的特化上,將使用for這裡寫**片迴圈還是memcpy拷貝進行函式封裝,在主拷貝函式中呼叫次拷貝函式,三個函式構成函式過載

` struct truename

; struct falsename

; template

struct name

;template < >

struct name

;template < >

struct name

;template < >

struct name

;template < >

struct name

;template

void copy(t* dest, t*src, int sz, truename)

template

void copy(t* dest, t*src, int sz, falsename) }

template

void copy(t*dest, t*src, int sz)

這種方式的實現也比較簡單,關鍵是要理清思路。

` 看一下測試**吧

int arr[4] = ;

int arr2[6] = ;

int sz = sizeof(arr) / sizeof(arr[0]);

copy(arr2, arr, sz);

for (int i = 0; i < 6; i++)

注:第二種和第三種方式都是型別萃取的方式,大家要細細品味和理解。

執行結果:

執行結果

c 之型別萃取

剛剛我們接觸過模板類,類似於這樣的 在這個類中,我們如何知道它是什麼型別的呢?這裡,我們可以在類中加入乙個內嵌型別,如 這樣就可以知道它是使用者自定義的還是本身型別就擁有的,我們用到了型別萃取的方式。我們把 ispodtype叫做內嵌型別。當我們遇到其他型別時,就將 ispodtype定義為 fal...

模板之型別萃取

函式類模板萃取主要針對的是含有自定義型別的函式 我們的型別函式如果需要拷貝往往可以通過給定庫函式經行萃取,但是尼?我們的型別函式型別中每乙個變數中含有的成員個數都是不知道的,我們就需要另外一種拷貝深拷貝的方式,對我們的自定義型別經行處理。好了,我們定義一種不需要傳遞第三引數的方法型別萃取一下。定義自...

C 模板 之 型別萃取 與 容器介面卡

型別萃取 在模板這裡主要就是對於模板的不同型別的例項化 有不同的方案 這樣可以提高效率等 比如 下面的 順序表 在擴容時的拷貝 對於沒有含有指向空間的指標的類 如int 自動使用memcpy 對於含有指向空間的指標的類 如string 就自動乙個乙個的賦值 防止淺拷貝導致兩個指標指向同一空間 析構兩...