模板就是把类型也作为参数。假设有一个函数如下。
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不是代表类,而是表示数据类型。
template <class T>//class用typename代替也可以
T max(T a, T b)
{
return (a > b) ? 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);
多模板参数时。
template<typename T,typename C>
void display(T a, C b)
{
cout << a << " " << b << endl;
}
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;
}
特别的提醒,在目前的开发环境下vs08.vs10都不能将模板类声明和实现分开编译,即不能写成.h和.cpp分开的样式,要写在一个.h下。
C++的标准模板库STL。
vector是向量,其实就是数组的封装,可以根据需要变长变短。"include<vector>"
如果要删除元素,可以用 l.erase(begin()+n),为删除第n个元素。
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;
}
迭代器iterator。我们通过迭代器可以访问模板库对象里的每个元素。
链表模板,list。特点是插入速度快。"include<list>",遍历只能用迭代器。
list<int>::iterator itor = list.begin();
for (; itor != list.end(); itor++)
{
cout << *itor << endl;
}
映射模板,map。存储的数据都是成对出现。"include<map>"
map<int, string> m;
pair<int, string>p1(10, "SH");
pair<int, string>p2(20, "BJ");
m.insert(p1);
m.insert(p2);
cout << m[10] << endl;
cout << m[20] << endl;