C++入门系列:第七章 类模板和向量

C++入门系列:第一章 认识C++的对象

C++入门系列:第二章 从结构到类的演变

C++入门系列:第三章 函数和函数模板

C++入门系列:第四章 类和对象

C++入门系列:第五章 特殊函数和成员

C++入门系列:第六章 继承和派生

C++入门系列:第七章 类模板和向量

C++入门系列:第八章 多态性和虚函数

C++入门系列:第九章 流类库

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值
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值