C++封装函数对数组进行操作

主函数 main.cpp

#include <iostream>
#include "QFMutableArray.hpp"

using namespace std;

int main(int argc, char const *argv[])
{

    QFMutableArray<int> *multableArray = new QFMutableArray<int>();
    // 初始化数组
    for (int i = 0; i < 10; i++)
    {
        multableArray->add(i);
    }
    cout << multableArray->str() << endl;
    /*
    // 在位置2添加元素99
    multableArray->add(2, 99);
    cout << multableArray->str() << endl;

    // 删除位置2元素
    multableArray->remove(2);
    cout << multableArray->str() << endl;

    // 元素下标位置
    cout << "元素 2 的下标位置为 " << multableArray->index(2) << endl;
    cout << "元素 100 的下标位置为 " << multableArray->index(100) << endl;

    // 删除元素 0
    cout << multableArray->removeElement(1) << endl;
    cout << multableArray->str() << endl;
    cout << multableArray->removeElement(10) << endl;

    // 清空元素
    multableArray->clear();
    cout << multableArray->str() << endl;
    */
    // 替换指定下标元素 并返回指定的元素
    cout << "被替换的元素是 : " << multableArray->set(2, 88) << endl;
    cout << multableArray->str() << endl;
    cout << "被替换的元素是 : " << multableArray->set(2, 99) << endl;
    cout << multableArray->str() << endl;

    cout << "下标 2 的元素是 : " << multableArray->get(2) << endl;
    cout << multableArray->str() << endl;

    cout << "元素个数是 : " << multableArray->length() << endl;

    // 排序元素 从小到大
    multableArray->sort();
    cout << multableArray->str() << endl;

    // 程序成功运行
    return EXIT_SUCCESS;
}

QFMutableArray.hpp 文件

#include "QFMutableContainer.h"
#include <string>
#include <sstream>
template <typename E>
class QFMutableArray : public QFMutableContainer<E>
{
private:
    E *array; // 真正用来存储元素的数组
    int len;  // 元素数量
public:
    QFMutableArray(); // 无参构造
    ~QFMutableArray();

    /*
    使用了override关键字但是基类中并没有对应的虚函数,能够检测出问题
    */
    // 在模板添加元素
    void add(E ele) override;
    // 在指定下标位插入一个元素
    void add(int index, E ele) override;
    // 按照下标删除元素
    E remove(int index) override;
    // 按照元素进行删除
    bool removeElement(E ele) override;
    // 清空容器
    void clear() override;
    // 通过下标修改元素 返回被覆盖的数
    E set(int index, E exe) override;
    // 通过下标获取元素
    E get(int index) override;
    // 排序
    void sort() override;
    // 查找元素出现的下标
    int index(E ele) override;
    // 将容器中的元素拼接成字符串
    string str() override;
    // 返回容器中元素数量
    int length() override;
};

template <typename E>
inline QFMutableArray<E>::QFMutableArray()
{
    array = new E[0];
    len = 0;
}

template <typename E>
inline void QFMutableArray<E>::add(E ele)
{
    /* 创建一个新数组,新数组长度是原数组长度+1
    将院楼数组的元素依次拷贝到新数组中,并且将新数据写入
    修改 Array 数组指向,指向新数组
    */
    // 1 创建新数组
    E *tmp = new E[len + 1];
    for (int i = 0; i < len; i++)
    {
        tmp[i] = array[i];
    }
    // 2添加元素放到最后
    tmp[len] = ele;
    len++;
    // 3.修改指针指向
    delete array;
    array = tmp;
}

// 在指定下标位插入一个元素
template <typename E>
inline void QFMutableArray<E>::add(int index, E ele)
{
    // 1 创建新数组
    E *tmp = new E[len + 1];
    for (int i = 0; i < index; i++)
    {
        tmp[i] = array[i];
    }
    // 2添加元素放到指定位置
    tmp[index] = ele;
    for (int i = index; i <= len; i++)
    {
        tmp[i + 1] = array[i];
    }

    len++;
    // 3.修改指针指向
    delete array;
    array = tmp;
}

// 考虑溢出情况,重新写
template <typename E>
inline E QFMutableArray<E>::remove(int index)
{

    E ele = array[index];
    E *tmp = new E[len - 1];
    for (int i = 0; i < index; i++)
    {
        tmp[i] = array[i];
    }
    for (int i = index; i < len; i++)
    {
        tmp[i] = array[i + 1];
    }
    len--;
    // 3.修改指针指向
    delete array;
    array = tmp;

    return ele;
}

template <typename E>
inline bool QFMutableArray<E>::removeElement(E ele)
{
    int find = index(ele);
    if (find == -1)
        return false;
    remove(find);
    return true;
}

template <typename E>
inline void QFMutableArray<E>::clear()
{
    // 将原来的数组置位空
    delete array;
    array = new E(0);
    // 重置元素数量
    len = 0;
}

template <typename E>
inline E QFMutableArray<E>::set(int index, E exe)
{
    if (index < 0 || index >= len)
    {
        return false;
    }
    E cover = array[index];
    array[index] = exe;
    return cover;
}

template <typename E>
inline E QFMutableArray<E>::get(int index)
{
    if (index < 0 || index >= len)
    {
        return false;
    }
    E cover = array[index];
    return cover;
}

template <typename E>
inline void QFMutableArray<E>::sort()
{
    for (int i = 0; i < len - 1; i++)
    {
        int minIndex = i;
        for (int j = i + 1; j < len; j++)
        {
            if (array[minIndex] > array[j])
            {
                minIndex = j;
            }
        }
        if (minIndex != i)
        {
            E tmp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = tmp;
        }
    }
}

template <typename E>
inline int QFMutableArray<E>::index(E ele)
{
    for (int i = 0; i < len; i++)
    {
        if (array[i] == ele)
        {
            return i;
        }
    }
    return -1;
}

// 将容器中的元素拼接成字符串
template <typename E>
inline string QFMutableArray<E>::str()
{
    if (len == 0)
    {
        return "[]";
    }
    // 创建一个 ostringstream 对象 来拼接元素
    ostringstream oss;
    oss << "[";
    for (int i = 0; i < len - 1; i++)
    {
        oss << array[i] << ",";
    }
    oss << array[len - 1] << "]";
    return oss.str();
}

template <typename E>
inline QFMutableArray<E>::~QFMutableArray()
{
    // 检查指针 array 是否为 nullptr,如果不是,则释放
    if (array != nullptr)
    {
        delete[] array;
        array = nullptr;
    }
}
template <typename E>
inline int QFMutableArray<E>::length()
{
    return len;
}

QFMutableContainer.h 文件

#ifndef QFMUTABLECONTAINER_H
#define QFMUTABLECONTAINER_H

#include <iostream>
#include <sstream>
using namespace std;

// 定义模板类
template <typename E>
class QFMutableContainer
{

public:
    ~QFMutableContainer() { cout << "QFMutableContainer 析构函数" << endl; }

    // 在模范添加元素
    virtual void
    add(E ele) = 0;
    // 在指定下标位插入一个元素
    virtual void add(int index, E ele) = 0;
    // 安装下标删除元素
    virtual E remove(int index) = 0;
    // 按照元素进行删除
    virtual bool removeElement(E ele) = 0;
    // 清空容器
    virtual void clear() = 0;
    // 通过下标修改元素
    virtual E set(int index, E exe) = 0;
    // 通过下标获取元素
    virtual E get(int index) = 0;
    // 排序
    virtual void sort() = 0;
    // 查找元素出现的下标
    virtual int index(E ele) = 0;
    // 将容器中的元素拼接成字符串
    virtual string str() = 0;
    // 返回容器中元素数量
    virtual int length() = 0;
};
#endif
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值