1 类模板声明
类模板声明的一般方法如下:
template <类模板参数> class 类名 {};
用类模板定义对象的一般格式如下:
类名<模板实例化参数类型> 对象名(构造函数实参列表);
类名<模板实例化参数类型> 对象名; // 默认或者无参构造函数
在类体外面定义成员函数时,必须用template重写类模板声明:
template<模板参数>
返回类型 类名<模板类型参数>::成员函数名(函数参数列表) { // 函数体 }
#include <iostream>
using namespace std;
template <typename T>
class Point {
T x, y;
public:
Point(T x, T y) {
this->x = x;
this->y = y;
}
void display() {
cout << x << "," << y << endl;
}
};
template <typename T>
class Line:public Point<T> {
T x2, y2;
public:
Line(T a, T b, T c, T d):Point<T>(a, b) {
x2 = c;
y2 = d;
}
void display() {
Point<T>::display();
cout << x2 << "," << y2 << endl;
}
};
int main() {
Point<int> a(3, 8);
a.display();
Line<int> ab(4, 5, 6, 7);
ab.display();
Line<double> ad(4, 5, 6.5, 7.8);
ad.display();
return 0;
}
2 定义向量列表
向量是一维数组的类版本,它与数组相似,其中的元素项是连续存储的,但它和数组不同的是:向量中存储元素的多少可以在运行中根据需要动态地增长或缩小。向量是类模板,具有成员函数。(简单说,向量就是java的List)
向量(vector)类模板定义在头文件vector中,它提供4种构造函数,用来定义由各元素组成的列表。
vector<char> A; // 定义空的char向量
vector<int> B(20); // 定义具有20个int的向量,元素初始值均为0
vector<int> C(20, 1); // 定义具有20个int的向量,元素初始值均为1
// IA是数组名也是数组起始地址,IA+10是VB的结束标志位,VB的长度为10
// 因为向量自动产生一个结束标志位,所以VB不需要与IA等长。
// 这里VB的长度可以小于10或大于10。当定义的VB比IA长时,第10个以后的元素值不确定
// 需要注意的是,不能使用这种方法去初始化一个已经声明或定义过的向量
int IA[10] = {1, 3, 5, 7, 9, 12, 14, 16, 18, 20};
vector<int> VB(IA, IA+10);
3 泛型指针
向量具有指示第一个元素的标记begin和指示结束的标记end,也就是标识要进行操作的元素空间。
在向量中,泛型指针是在底层指针的行为之上提供一层抽象化机制,取代程序原来的“指针直接操作方式”。假设用T表示向量的参数化数据类型,iterator在STL里面是一种通用指针,它在向量中的作用相当于T*。用iterator声明向量的正向泛型指针的一般形式如下:
vector<type>::iterator 泛型指针名
// 表示向量的数据类型为char,指针名为p
// 注意定义里使用p,不是*p
// vector<char>::itrator相当于char*,泛型指针是用类实现的,不要与以前学过的指针定义混淆
vector<char>::iterator p
对向量的访问可以是双向的,图中的rbegin和rend是提供给逆向泛型指针的开始和结束标志。声明逆向泛型指针使用reverse_iterator
:
vector<数据类型>::reverse_iterator 指针名
使用typedef可使声明或定义泛型指针的手续简单易懂:
typedef vector<char>::iterator iterator;
使用时
iterator p;
4 向量最基本的操作
4.1 访问向量容量信息的方法
//返回当前向量中已经存放的对象的个数
size()
// 返回向量可以容纳最多对象的个数,一般是操作系统的寻址空间所能容纳的对象的个数。这个参数不是用户指定的,它取决于硬件结构
max_size()
// 返回无需再次分配内存就能容纳的对象个数。它的初始值为程序员最初申请的元素个数。当存放空间已满,又增加一个元素时,它在原来的基础上自动翻倍扩充空间,以便存放更多的元素
capacity()
上面三者的关系:
max_size() >= capacity() >= size()
// 当前向量为空时,返回true值
empty()
4.2 访问向量中对象的方法
front() // 返回向量中的第1个对象
back() // 返回向量中最后一个对象
operator[](size_type, n) // 返回向量中的第n+1个对象(下标为n的向量元素)
4.3 在向量中插入对象的方法
push_back(const T&) // 向向量尾部插入一个对象
insert(iterator it, const T&) // 向it所指的向量位置前插入一个对象
insert(iterator it, size_type n, const T&X) // 向it所指向量位置前插入n个值为X的对象
4.4 在向量中删除对象的方法
pop_back(const T&) // 删除向量中最后一个对象
erase(iterator it) // 删除it所指向的容器对象
clear() // 删除向量中的所有对象,empty()返回true值