模板就是實現與型別無關的**,增加了**的復用性。模板分為模板函式和模板類
模板函式的格式typedef
返回型別 函式名 引數列表
class也可以用typename,意義相同。
當需要資料大於所給定的資料時這時我們會考慮增容。
void vector ::_checkcapacity()
}void test()
我們再看下監視視窗:
我們再畫出物件模型來分析:
當資料緩衝區的資料小於15時,直接拷貝資料,不會出先野指標的問題,當資料緩衝區的資料大於15時,這是就會在堆上開闢空間,有兩個ptr指標指向這同一塊空間,呼叫memcpy拷貝資料後,當呼叫delete函式時會呼叫析構函式,釋放s1,此時ptr2也指向這塊空間,此時ptr2就是乙個野指標,這時候就會出先記憶體洩露的問題。
要怎麼解決呢?這時我們會想到深拷貝:
template void vector ::_checkcapacity()
delete_data;
_data = tmp;
_capacity = newcapacity;
}
順序表的模板實現:
#include#include#includeusing namespace std;
template class vector
;//構造
template vector ::vector()
:_data(null)
,_size(0)
,_capacity(0)
{}//拷貝構造 s2(s1)
template vector ::vector(const vector&v)
_size = v._size;
_capacity = v._capacity;
}//賦值運算子的過載s3 = s1;
template vector&vector ::operator =(const vector& v)
delete_data;
_data = tmp;
_size = _v._size;
_capacity = v._capacity;
} return *this;
}template vector ::~vector() }
template void vector :: print()
cout << endl;
}template void vector ::_checkcapacity()
delete_data;
_data = tmp;
_capacity = newcapacity; }}
//尾插
template void vector ::pushback(const t& x)
//尾刪
template void vector ::popback()
//頭插
template void vector ::pushfront(const t& x)
_data[0] = x;
++_size;
}//頭刪
template void vector ::popfront()
--_size;
}//在位置上插入資料
template void vector ::insert(size_t pos, const t&x)
else
_data[pos] = x;
++_size; }}
//刪除某個位置的資料
template void vector ::erase(size_t pos)
--_size;
}int main()
模板實現順序表
一 seqlist.h pragma once include include include using namespace std template class seqlist seqlist void pushback const t x 最好傳引用,不傳引用,如果t為string,傳參時拷貝...
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 ...