模板 模板就是把类型当做参数,假设有一下代码 代码1:
int max(int a, int b){ return (a > b) ? a; b; }char max(char a, char b){ return (a > b) ? a; b; }上述代码的两个函数逻辑结构相同,但是数据结构不一样,要实现只编写一个函数就能实现所有的这些函数,就要用到模板。 模板的关键字:template typename class(这里的class不是代表类,而是表示数据类型) 所以代码1可以写成如下模式 代码1.1
template <class T>//class用typename代替也可以T max(T a, T b)//函数模板{ return (a > b) ? a; b;}int ival = max(100,99);//模板函数char cval = max<char >('A','B');用typename的方式如下代码
template<typename T>void swap(T& a, T& b){ T tmp = a; a = b; b = tmp;}int x = 20, y = 30;swap<int>(x, y);变量作为模板的参数如下代码所示
tymplate<int size>void display(){ cout<<size<<endl;}display<10 >();多模板参数时方法如下代码所示
template<typename T,typename C>void display(T a, C b){ cout << a << " " << b << endl;}int a=1024;string str="Hello world!";display<int ,string >(a,str);对于C++来说,同样也存在着类模板,代码如下所示
template<typename T>class MyArray{public: void display();PRivate: T *m_pArr;//数据成员指针};//类外定义时大不相同template<class T>//所有成员函数都要加这一句void MyArray<T>::display(){ ....}int mian(){ MyArray<int> arr; arr.display(); return 0;}同时在这里需要注意的是在目前的开发环境下不能将类模板的声明和实现分开编译,即不能分别写成.h和.cpp文件分开的样式,可以全部写在.h文件下,最后用include调用。
标准模板库(STL) vector 向量,头文件#include,其实就是数组的封装,下面说一下用法
vector<T> v1;//保存类型为T的对象,默认构造函数v1为空vector<T> v2(v1);//v2是v1的一个副本vector<T> v3<n, i>;//v3包含n个值为i的元素vector<T> v4(n);//v4包含初始化元素的n个副本empty();//判断是否为空,返回bool类型begin();//返回向量迭代器的首元素end();//返回向量迭代器最后一个元素的下一个元素clear();//清空向量front();//第一个数据back();//最后一个数据size();//数据个数push_back();//将数据插入向量尾部pop_back();//删除尾部数据int main(){ vector<int >vec; vec.push_back(10); vec.pop_back(); cout << vector.size() << endl; return 0;}若要删除元素,可以l.erase(begin()+n),为删除第n个元素。
迭代器iterator,通过迭代器我们可以访问对象的每个元素
int main(){ vector vec; vec.push_back("hello"); vector<string >::iterator citer=vec.begin(); for(;citer!=vec.end();citer++){ cout<<*citer<<endl; } return 0;}链表模板(list) 链表模板的特点是插入速度快,头文件#include,遍历只能用迭代器
list<int>::iterator itor = list.begin();for (; itor != list.end(); itor++){ cout << *itor << endl;}映射模板(map) 映射模板存储的数据都是成对出现的,头文件#include
map<int, string> m;pair<int, string>p1(10, "SH");//pair定义若干对pair<int, string>p2(20, "BJ");m.insert(p1);m.insert(p2);cout << m[10] << endl;cout << m[20] << endl;新闻热点
疑难解答
图片精选