手动撸一个c++数组类
程序员文章站
2024-03-13 12:44:51
...
引言:虽然数组不是c++标准库类型,但是对于我们平时解决业务上的一些问题很有帮助,这里可以自己实现自己的迷你版数组类。即实现平常使用的一些数组的封装方法,使自己对c++中数组这一类型有更加深刻的了解。
一、首先总结一下自定义数组包含的方法:
1、获取数组的大小:size();
2、获取数组的容量:capcacity();
3、尾部插入元素:push();
4、尾部删除元素:pop();
5、访问数组元素:operator[]()
//即重载访问运算符
二、首先是数组类的声明和定义:
因为使用了类模板,所以我们将声明和定义放在同一个文件中:
文件名:myArray.hpp
#pragma once
#include <iostream>
#include <string>
using namespace std;
/********************************
*类模板的使用测试
*手动撸一个数组(数组封装)
********************************/
template <class T>
class MyArray {
public:
MyArray() = default; //默认构造
MyArray(const int capacity); //自定义构造
MyArray(const MyArray & array); //拷贝构造
int size() const; //获取当前的元素个数
int capacity() const; //获取当前数组的空间容量
void push(const T &e); //插入元素
void pop(); //删除尾部元素
T& operator[] (size_t index); //重载访问运算符
~MyArray(); //默认析构
private:
T *pAddress; //在堆区开辟的空间的首地址
int mSize; //数组的实际大小
int mCapacity; //数组的容量
};
//自定义构造
template <class T>
MyArray<T>::MyArray(const int capacity) {
this->mSize = 0;
this->mCapacity = capacity;
this->pAddress = new T[mCapacity];
}
//拷贝构造
template <class T>
MyArray<T>::MyArray(const MyArray & array) {
mCapacity = array.mCapacity;
mSize = array.mSize;
this->pAddress = new T[array.mCapacity];
for (int index = 0; index < this->mSize; ++index) {
pAddress[index] = pAddress[index];
}
}
//获取数组的容量
template <class T>
int MyArray<T>::capacity() const {
return this->mCapacity;
}
//获取数组当前的元素数
template <class T>
int MyArray<T>::size() const {
return this->mSize;
}
//尾部插入元素
template <class T>
void MyArray<T>::push(const T &e) {
if (this->mSize == this->mCapacity) {
cout << "数组已满,无法插入!!!" << endl;
}
else {
//注释掉的这一部分是多余处理,其实不需要
/*
T *newSpace = new T[mCapacity];
//for (int i = 0; i < mSize; ++i) {
// newSpace[i] = pAddress[i];
}
*/
pAddress[this->mSize] = e;
this->mSize++;
}
}
//删除尾部元素
template <class T>
void MyArray<T>::pop() {
if (!this->mSize) {
cout << "数组为空,无删除操作" << endl;
return;
}
T *newSpace = new T[mCapacity];
for (size_t i = 0; i < this->mSize - 1; ++i) {
newSpace[i] = pAddress[i];
}
pAddress = newSpace;
this->mSize--;
}
//重载访问运算符
template <class T>
T& MyArray<T>::operator[](size_t index) {
return this->pAddress[index];
}
//自定义析构函数
template <class T>
MyArray<T>::~MyArray() {
if (this->pAddress)
delete[] pAddress; //堆区空间手动开辟一定记得手动释放
}
最后是函数的测试部分(main函数):(没有技术含量的一部分):
#include <iostream>
#include <string>
#include "myArray.hpp"
using namespace std;
int main()
{
MyArray<int> array(5);
cout << "数组的容量是:" << array.capacity() << endl;
cout << "数组的元素数是:" << array.size() << endl;
MyArray<int> array2(array);
cout << "数组的容量是:" << array.capacity() << endl;
cout << "数组的元素数是:" << array.size() << endl;
cout << "*************************" << endl;
cout << "插入元素后的数组:" << endl;
for (int i = 0; i < 5; ++i) {
array.push(i);
}
cout << "数组的容量是:" << array.capacity() << endl;
cout << "数组的元素数是:" << array.size() << endl;
//这里可以使用int和size_t
for (int i = 0; i < array.size(); ++i) {
cout << array[i] << " ";
}
cout << endl;
cout << "*************************" << endl;
cout << "删除元素后的数组:" << endl;
array.pop();
cout << "数组的容量是:" << array.capacity() << endl;
cout << "数组的元素数是:" << array.size() << endl;
for (int i = 0; i < array.size(); ++i) {
cout << array[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
测试结果如下:
总结:数组的方法还有很多可以自己去尝试实现一下,比如有迭代器、resize等等方法,我觉得只要是知道了使用类模板这一思想,剩下方法的实现都是大同小异。
推荐阅读
-
手动撸一个c++数组类
-
共享一个PHP对二维数组的某个字段进展升降排序类
-
定义一个抽象类一水果,创建若干水果对象存放在-一个水果类型的数组中,输出数组中所有水果的类型、重量
-
Python自定义一个数组类,支持数组之间的四则运算和其他常见方法
-
C++笔记一(创建一个不带指针成员变量的类)[注意事项]
-
C++实现LeetCode(34.在有序数组中查找元素的第一个和最后一个位置)
-
C++模板学习之数组类模板实例讲解
-
c++ 动态数组类的创建和简单运用
-
算法(C++):给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数
-
在C++的函数中如何指定一个数组,使得这个数组的大小由函数的输入值来决定