搜索
简帛阁>技术文章>C++ 可变数组实现

C++ 可变数组实现

话不多说,直接上代码,看注释

#include <iostream>
#include <cstring>

using namespace std;

// 可变数组实现
template<class T>
class Array {
    template<class E>
    friend ostream& operator<<(ostream &_cout, Array<E> &array);  // 重载  << 运算符可直接实现打印
    int mSize = 0, mCapacity;  // 数组元素个数; 数组容量
    T *mPosition;  // 数组首地址
    int indexCheck(int position){
        if (position > mSize || position < -(mSize)) throw out_of_range("数组越界");  // 输入参数越界时,抛出异常
        return position < 0 ? position + mSize : position;  // 支持负索引,最后一个索引为-1
    }

    void expandCapacity(){
        mCapacity += 5;
        T *newPosition = new T[mCapacity]; // 每次申请5个
        memcpy(newPosition, mPosition, mSize * sizeof(T)); // 把原数组的数据拷贝进新数组
        mPosition = newPosition;  // 指针指向更新
    }
public:
    // 数组初始化,输入参数小于0,默认为5的数组
    explicit Array(int capacity = 5) : mCapacity(capacity) {
        mPosition = new T[mCapacity];  // 在堆区申请内存
    }

    // 析构函数
    ~Array() {
        delete[] mPosition;  // 释放堆区空间
        mPosition = nullptr;
    }

    // 向数组内添加元素
    void add(T value) {
        // 当前元素等于容量
        if (mSize == mCapacity) expandCapacity();  // 扩大容量
        *(mPosition + mSize) = value;  // 向数组中添加元素
        mSize++;
    }

    // 获取数组内指定索引的元素
    T get(int position) {
        return *(mPosition + indexCheck(position));
    }

    // 重载[]运算符,可以使用索引获取
    T operator[](int position) {
        return get(position);
    }

    // 获取当前元素个数
    int size() const {
        return mSize;
    }

    // 删除数组类指定位置的元素
    bool remove(int position){
        position = indexCheck(position);
        for (int i = position+1; i < mSize; ++i) {
            *(mPosition+i-1) = *(mPosition+i);  // 所有元素前移
        }
        mSize--;
        return true;  // 删除成功
    }

    bool insert(int position, int value){
        position = indexCheck(position);  // 索引合法性检查
        if (mSize == mCapacity) expandCapacity();  // 如果当前数组已满,扩大容量
        for (int i = mSize; i >= position; --i) {
            *(mPosition+i+1) = *(mPosition+i);
        }
        *(mPosition+position) = value;
        mSize ++;
        return true;
    }
};

//  重载  << 运算符可直接实现打印
template <class T>
ostream &operator<<(ostream &_cout, Array<T> &array){
    cout << "[";
    for (int i = 0; i < array.mSize; ++i) {
        cout << array[i];
        if (i != array.mSize-1) cout << ", ";
    }
    cout << "]";
    return _cout;
}

 

如有问题,感谢批评指正

@importurl(http://icnblogscom/Loadashx?typestyle&fileSyntaxHighlightercss);@importurl(/css/cuteedito
可变参数可变参数是指函数的参数的数据类型和数量都是不固定的。printf函数的参数就是可变的。这个函数的原型是:intprintf(constchar*format,)。用一段代码演示printf的
自:http://blogcsdnnet/weiwangchao_/article/details/4857567C函数要在程序中用到以下这些宏:voidva_start(va_listarg_pt
段代码展示了如何不使用<stdargh>中的va_list、va_start、va_end宏来实现自定义可变参数以及如何改变默认的%d、%f、%s等格式字符。复制代码代码如下:inclu
可变参数的实现要解决三个问题:1如何调用带有可变参数的函数2如何编译有可变参数的程序3在带有可变参数的函数体中如何持有可变参数第一个问题,调用时在可以传入可变参数的地方传入可变参数即可,当然,还有一些
C语言的printf函数,参数的数量可以是可变的。使用va_start和va_end实现C++中,实现参数可变,可以用overload。如果参数数量不是很多的话,可以一个参数实现一个函数,两个参数再
C可变参数有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演
C语言的stdargh头文件中提供了三个函数va_start,va_end,va_arg和一个类型va_list。利用它们,我们可以很容易实现一个可变参数的函数。首先简单介绍一下这三个函数。假设现
CC++中,数组在声明过程中,数组名称为const指针,不许修改。且数组的大小在声明时被写死,非常不方便。C语言中常用下面代码替代指针。include<stdioh>include&
目录1、简介2、简单的使用方式总结1、简介今天看到一个有趣的东西C语言的可变参数函数众所周知,C语言的函数不能重载,那么你printf和scanf是怎么可以输入多个参数的例如查看到的printf的定义