用类模板实现的【动态数组模板】
程序员文章站
2022-06-01 13:12:05
...
动态数组模板的特点:
- 自动扩容。构造函数里初始化的长度为10,数组被填满时会自动扩容,保留数据不变的前提下重新分配地址长度。
- 任何数据类型的数组都可以创建,前提是注意打印输出的格式,尤其是自定义的class类型,需要重载"<<"符号。参考例程中的Point。
- 实现功能:增,删,查,打印。
add(int dat):向数组插入一个数据
get(int index):按照索引(下标)获取数组中的数据
size():得到数组的大小
travel():把数组打印一遍
remove(int index):按照索引(下标)删除数组中的数据
//动态数组-类模板
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
//自定义一个类:点。类内重载了"<<"符号,方便打印输出。
class Point {
public:
Point() {
}
Point(int x, int y) :
x(x), y(y) {
}
Point(Point& p) {
this->x = p.x;
this->y = p.y;
}
void show() {
printf("Point[x=%d, y=%d]", x, y);
}
friend ostream& operator<<(ostream& os, const Point& p);
private:
int x, y;
};
ostream& operator<<(ostream& os, const Point& p) { //重载“<<”号
os << "Point[x=" << p.x << ", y=" << p.y << "]";
return os;
}
//动态数组模板基(父)类,可以不写
template<typename T>
class List {
public:
virtual void add(T dat) = 0; //向数组插入一个数据
virtual T get(int index) = 0; //按照索引(下标)获取数组中的数据
virtual int size() = 0; //得到数组的大小
virtual void travel() = 0; //把数组打印一遍
virtual int remove(int index) = 0; //按照索引(下标)删除数组中的数据
virtual ~List() {
}
};
//动态数组模板的派生(子)类,继承基类
template<typename T>
class ArrayList: public List<T> {
public:
ArrayList() {
len = 10;
arr_Size = 0;
this->arr = new T[len];
}
~ArrayList() {
delete[] arr;
}
void add(T dat) {
*(arr + arr_Size) = dat;
arr_Size++;
if (arr_Size >= len) {
arr_Expansion();
}
}
int size() {
return arr_Size;
}
void travel() {
int i = 0;
printf(
"============================================================================\n");
printf("arr_Size:%d\n", arr_Size);
for (; i < arr_Size; i++) {
cout << *(arr + i) << "\t";
if (i % 10 == 9) {
printf("\n");
}
}
printf("\n");
printf(
"============================================================================\n");
}
T get(int index) { //要加一个index在0~arr_Size之间的判断,不在就是越界,return -1
if (index < 0 || index > arr_Size) {
printf("越界\n");
//return -1;
}
return *(arr + index);
}
int remove(int index) { //要加一个index在0~arr_Size之间的判断,不在就是越界,return -1
if (index < 0 || index > arr_Size) {
printf("越界\n");
return -1;
}
for (int i = index; i < arr_Size; i++) {
if (index == arr_Size) {
//*(arr + arr_Size) = '\0';
}
*(arr + i) = *(arr + i + 1);
}
arr_Size--;
printf("It is successful to remove!\n");
return 1;
}
private:
int len;
int arr_Size;
T* arr;
void arr_Expansion() {
T* arr1 = arr;
len += 10;
arr = new T[len];
for (int i = 0; i < len; i++) {
*(arr + i) = *(arr1 + i);
}
delete[] arr1;
}
};
int main() {
ArrayList<int> list1; //int型数组
for (int i = 1; i <= 100; i++) {
list1.add(i);
}
list1.travel();
ArrayList<double> list2; //double型数组
for (int i = 1; i <= 100; i++) {
list2.add(0.01 * i);
}
list2.travel();
ArrayList<char> list3; //char型数组
for (int i = 32; i <= 100; i++) {
list3.add(i);
}
list3.travel();
Point p;
ArrayList<Point> list4; //自定义类Point型数组
for (int i = 1; i <= 100; i++) {
p = Point(i, i);
list4.add(p); //list4.add(Point(i, i))的方式不行,用p过渡一下
}
list4.travel();
}
cout << list4.get(50) << endl;
运行结果(Eclipse):
list1、list2
list3、lit4
上一篇: 单向链表 ---- C++使用类模板实现
下一篇: 正确选择竞价排名标题的技巧