模板實現順序表

2021-08-16 01:19:43 字數 3056 閱讀 3898

一   :

seqlist.h

#pragma once

#include#include#include using namespace std;

template class seqlist

~seqlist() }

void pushback(const t&x)//最好傳引用,不傳引用,如果t為string,傳參時拷貝構造(深拷貝,至少引用計數的淺拷貝)代價太大

void checkcapacity() }

void print()

cout << endl;

}private:

t* _a;

size_t _size;

size_t _capacity;

};

test.cpp

#include"seqlist.h"

void testseqlist()

;int main()

以上**會出現問題,當t是int時不出錯,當t為string時程式崩潰

什麼原因造成的呢?

呼叫發現出錯在operator =  ,通過呼叫堆疊除錯發現出錯再checkcapacity() ,_a=(t*)realloc(_a,_capacity*sizeof(int))提示為錯誤的指標。

錯誤原因是:realloc和new的區別,new會呼叫建構函式,realloc不會呼叫建構函式 ,物件沒有初始話,_a指向隨機值,賦值時會出錯,operator=時,是深拷貝會先釋放原來空間,釋放隨機值因此出錯。

如何改正呢?

二 :那我們就用new來申請空間,delete來析構

將析構函式改為:

~seqlist()

}

將checkcapacity()改為:

可是上面用memcpy的這種情況當t為string時也會出現(淺拷貝)的問題。

三  :

接下來我們先看一下string的相關問題

因此:我們就可以知道,如果第一次存放的資料》=16,就會動態開闢,用ptr指向。當記憶體不夠時,checkcapacity會動態開闢記憶體,memcpy是按位元組拷貝,它把ptr指標拷貝下來(淺拷貝),拷貝完會把之前的析構調,因此新的ptr相當乙個野指標,指向隨機值,相當於兩個ptr指向一塊空間,析構時會析構兩次會出錯。

四  :

該怎麼解決呢?

用for迴圈賦值運算,因為我們知道string賦值運算子過載它是深拷貝,因此將checkcapacity()改為

void checkcapacity()

}delete_a;

_a = new_a;

} }

模板實現順序表注意:

1.開空間用new,析構空間用delete.因為new開的空間會呼叫建構函式,會初始化。

2.拷貝資料用for迴圈拷貝(memcpy 淺拷貝,如果t為string會出錯) for迴圈拷貝,為賦值,而賦值運算子過載為深拷貝。

四   完整版,主要是實現拷貝構造,構造,賦值運算子過載,析構等等  及介面就只實現了乙個,因為前面已經實現很多次了

seqlist.h

#pragma once

#include#include#include using namespace std;

template class seqlist

seqlist(const t*a, size_t size,size_t capacity)//帶參構造

:_a(new t[capacity])

,_size(size)

, _capacity(capacity) }

~seqlist() }

seqlist(const seqlist & s)//拷貝構造 借助建構函式 現**法

//seqlist(const seqlist &s)//拷貝構造 自己實現 傳統寫法

// // _size = s._size;

// _capacity = s._capacity;

//}/*seqlist&operator=(seqlist s)//賦值運算子過載 也是借用拷貝構造 現**法 注意此處沒有引用

return *this

}*///seqlist&operator=(seqlist & s)//賦值運算子過載 現**法

// // return *this

//}seqlist &operator=(seqlist & s)//賦值運算子過載 傳統寫法 }

void pushback(const t&x)//最好傳引用,不傳引用,如果t為string,傳參時拷貝構造(深拷貝,至少引用計數的淺拷貝)代價太大

//void checkcapacity()

// // _a = new_a;

// }

//}void checkcapacity()

}delete_a;

_a = new_a;

} }void print()

cout << endl;

}private:

t* _a;

size_t _size;

size_t _capacity;

};

test.c

#include"seqlist.h"

void testseqlist()

;int main()

模板實現順序表

模板就是實現與型別無關的 增加了 的復用性。模板分為模板函式和模板類 模板函式的格式typedef 返回型別 函式名 引數列表 class也可以用typename,意義相同。當需要資料大於所給定的資料時這時我們會考慮增容。void vector checkcapacity void test 我們再...

C 模板實現順序表

pragma once include include include linearlist.h using namespace std const int defaultsize 100 templateclass seqlist public linearlist int size const ...

順序表C 模板實現

include using namespace std const int maxsize 20 template class sqlist template sqlist sqlist template sqlist sqlist template void sqlist creatlist t ...